Add Chat Rooms with Turbo

This commit is contained in:
TheNeedful-DO 2023-12-04 08:27:21 +00:00
parent bf691f5567
commit 75783e605d
23 changed files with 195 additions and 16 deletions

View File

@ -352,6 +352,8 @@ GEM
nokogiri (1.15.5)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
nokogiri (1.15.5-x86_64-linux)
racc (~> 1.4)
notiffany (0.1.3)
nenv (~> 0.1)
shellany (~> 0.0)
@ -566,6 +568,7 @@ GEM
PLATFORMS
ruby
x86_64-linux
DEPENDENCIES
activejob-status (~> 1.0)

View File

@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the Rooms controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: https://sass-lang.com/

View File

@ -19,8 +19,8 @@ class ApplicationController < ActionController::Base
def user_not_authorized(exception)
policy_name = exception.policy.class.to_s.underscore
# flash[:alert] = "#{policy_name}.#{exception.query}"
# flash[:alert] = "Unable to #{exception.query[0..-2]} #{policy_name.split("_")[0].capitalize}"
flash[:error] = t "#{policy_name}.#{exception.query}", scope: "pundit", default: :default
# flash[:error] = t "#{policy_name}.#{exception.query}", scope: "pundit", default: :default
flash[:alert] = "Unable to #{exception.query[0..-2]} #{policy_name.split("_")[0].capitalize}"
redirect_to (request.referrer || root_path)
end
end

View File

@ -0,0 +1,28 @@
class RoomsController < ApplicationController
before_action :set_room, only: %i[ show edit update destroy ]
def index
@rooms = policy_scope Room.all
authorize @rooms
authorize @new_room = Room.new
end
def create
authorize @room = Room.build(name: params["room"]["name"])
@room.save
end
def show
authorize @room
@rooms = Room.public_rooms
render "index"
end
private
# Use callbacks to share common setup or constraints between actions.
def set_room
@room = Room.find(params[:id])
end
end

View File

@ -0,0 +1,2 @@
module RoomsHelper
end

View File

@ -1 +1,2 @@
import 'controllers'
import "@hotwired/turbo-rails"

5
app/models/room.rb Normal file
View File

@ -0,0 +1,5 @@
class Room < ActiveRecord::Base
validates_uniqueness_of :name
scope :public_rooms, -> {where(is_private: false)}
after_create_commit { broadcast_append_to "rooms" }
end

View File

@ -0,0 +1,56 @@
class RoomPolicy
attr_reader :user, :model
def initialize(user, model)
@user = user || User.new
@room = model
end
class Scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
if user.admin?
scope.all
else
#TODO: private chats
scope.all
end
end
private
attr_reader :user, :scope
end
def index?
true
end
def show?
true
end
def new?
@user.admin?
end
def create?
@user.admin?
end
def edit?
@user.admin?
end
def update?
@user.admin?
end
def destroy?
@user.admin?
end
end

View File

@ -0,0 +1,3 @@
= form_with(model: @new_room, remote: true) do |f|
= f.text_field :name, class: "form-control", autocomplete: 'off'
= f.submit data: { disable_with: false }

View File

@ -0,0 +1,2 @@
%div
= link_to room.name, room

View File

@ -0,0 +1,11 @@
- if @room
%h4= @room.name
%h1 Rooms index
= render partial: "layouts/new_room_form"
= turbo_stream_from "rooms"
#rooms
%div
= render @rooms

View File

@ -1,5 +1,6 @@
development:
adapter: async
adapter: redis
url: redis://127.0.0.1:6379/1
test:
adapter: test

View File

@ -6,3 +6,4 @@ pin '@hotwired/stimulus-loading', to: 'stimulus-loading.js', preload: true
pin_all_from 'app/javascript/models', under: 'models'
pin_all_from 'app/javascript/controllers', under: 'controllers'
pin_all_from 'app/javascript/subscriptions', under: 'subscriptions'
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true

View File

@ -1,16 +1,16 @@
module DevisePermittedParameters
extend ActiveSupport::Concern
# module DevisePermittedParameters
# extend ActiveSupport::Concern
included do
before_action :configure_permitted_parameters
end
# included do
# before_action :configure_permitted_parameters
# end
protected
# protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
end
end
# def configure_permitted_parameters
# devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
# devise_parameter_sanitizer.permit(:account_update, keys: [:name])
# end
# end
DeviseController.send :include, DevisePermittedParameters
# DeviseController.send :include, DevisePermittedParameters

View File

@ -1,4 +1,5 @@
Rails.application.routes.draw do
resources :rooms
resources :commands do
member do
get 'run'

View File

@ -0,0 +1,10 @@
class CreateRooms < ActiveRecord::Migration[6.1]
def change
create_table :rooms do |t|
t.string :name
t.boolean :is_private, default: false
t.timestamps
end
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2023_12_02_164132) do
ActiveRecord::Schema.define(version: 2023_12_03_160243) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -179,6 +179,13 @@ ActiveRecord::Schema.define(version: 2023_12_02_164132) do
t.index ["follower_id"], name: "index_relationships_on_follower_id"
end
create_table "rooms", force: :cascade do |t|
t.string "name"
t.boolean "is_private", default: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "seats", force: :cascade do |t|
t.integer "table_id"
t.integer "user_id"

6
spec/factories/rooms.rb Normal file
View File

@ -0,0 +1,6 @@
FactoryGirl.define do
factory :room do
name "MyString"
is_private false
end
end

View File

@ -0,0 +1,15 @@
require 'rails_helper'
# Specs in this file have access to a helper object that includes
# the RoomsHelper. For example:
#
# describe RoomsHelper do
# describe "string concat" do
# it "concats two strings with spaces" do
# expect(helper.concat_strings("this","that")).to eq("this that")
# end
# end
# end
RSpec.describe RoomsHelper, type: :helper do
pending "add some examples to (or delete) #{__FILE__}"
end

5
spec/models/room_spec.rb Normal file
View File

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe Room, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end

View File

@ -0,0 +1,11 @@
require 'rails_helper'
RSpec.describe "Rooms", type: :request do
describe "GET /index" do
it "returns http success" do
get "/rooms/index"
expect(response).to have_http_status(:success)
end
end
end

View File

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe "rooms/index.html.haml", type: :view do
pending "add some examples to (or delete) #{__FILE__}"
end