From e378dfab02d7c113b5af068feee63c01f56295f6 Mon Sep 17 00:00:00 2001 From: MrYummy Date: Sat, 27 May 2017 00:34:47 +0200 Subject: [PATCH] Added messaging feature --- app/assets/stylesheets/.style.css.scss.swp | Bin 0 -> 36864 bytes app/assets/stylesheets/style.css.scss | 7 +- app/controllers/forums_controller.rb | 2 +- app/controllers/forumthreads_controller.rb | 2 +- app/controllers/messages_controller.rb | 74 ++++++++++++++++++ app/controllers/threadreplies_controller.rb | 2 +- app/models/comment.rb | 2 +- app/models/message.rb | 20 +++++ app/models/threadreply.rb | 2 +- app/models/user.rb | 2 +- app/views/application/_md_editor.html.erb | 2 +- .../application/_md_editor_user.html.erb | 8 ++ app/views/blogposts/index.html.erb | 4 +- app/views/forums/show.html.erb | 2 +- app/views/forumthreads/edit.html.erb | 2 +- app/views/messages/index.html.erb | 23 ++++++ app/views/messages/new.html.erb | 19 +++++ app/views/messages/show.html.erb | 0 app/views/users/edit.html.erb | 2 +- db/migrate/20170524181458_create_messages.rb | 11 +++ .../20170525184355_change_message_to_text.rb | 5 ++ db/schema.rb | 57 ++++++++------ db/seeds.rb | 26 +++++- 23 files changed, 236 insertions(+), 38 deletions(-) create mode 100644 app/assets/stylesheets/.style.css.scss.swp create mode 100644 app/controllers/messages_controller.rb create mode 100644 app/models/message.rb create mode 100644 app/views/application/_md_editor_user.html.erb create mode 100644 app/views/messages/index.html.erb create mode 100644 app/views/messages/new.html.erb create mode 100644 app/views/messages/show.html.erb create mode 100644 db/migrate/20170524181458_create_messages.rb create mode 100644 db/migrate/20170525184355_change_message_to_text.rb diff --git a/app/assets/stylesheets/.style.css.scss.swp b/app/assets/stylesheets/.style.css.scss.swp new file mode 100644 index 0000000000000000000000000000000000000000..cb49b61e0aff243ab5e6a665705873bd7ef5536c GIT binary patch literal 36864 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 G+5`ZGv|@n( literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/style.css.scss b/app/assets/stylesheets/style.css.scss index 6de5aa2..de55b5b 100644 --- a/app/assets/stylesheets/style.css.scss +++ b/app/assets/stylesheets/style.css.scss @@ -480,6 +480,11 @@ blockquote p { padding: 4em 1em 1em; } } + .field_container_user { + position: relative; + .editor_field { + } + } } ul.dropdown-menu { @@ -1026,4 +1031,4 @@ nav.pagination { padding: 0.1em 0.2em; border-radius: 0.2em; text-shadow: none; -} \ No newline at end of file +} diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb index ecf570e..7d95bc6 100644 --- a/app/controllers/forums_controller.rb +++ b/app/controllers/forums_controller.rb @@ -92,4 +92,4 @@ class ForumsController < ApplicationController a = [:name, :position, :role_read_id, :role_write_id] + add params.require(:forum).permit(a) end -end \ No newline at end of file +end diff --git a/app/controllers/forumthreads_controller.rb b/app/controllers/forumthreads_controller.rb index b9b5714..86af50c 100644 --- a/app/controllers/forumthreads_controller.rb +++ b/app/controllers/forumthreads_controller.rb @@ -92,4 +92,4 @@ class ForumthreadsController < ApplicationController a += add params.require(:forumthread).permit(a) end -end \ No newline at end of file +end diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb new file mode 100644 index 0000000..e597d94 --- /dev/null +++ b/app/controllers/messages_controller.rb @@ -0,0 +1,74 @@ +class MessagesController < ApplicationController + + before_filter :check_permission, only: [:destroy] + + def index + if !current_user + flash[:alert] = "Please log in to see your private messages." + redirect_to blogposts_path + end + @messages = Message.where(user_target: current_user).page(params[:page]) + end + + def destroy + if @message.user_target.is?(current_user) + if @message.destroy + flash[:notice] = "Message deleted!" + else + flash[:alert] = "There was a problem while deleting this message" + end + else + flash[:alert] = "You are not allowed to delete this message" + end + redirect_to messages_path + end + + def create + if !message_params[:user_target_id] + flash[:alert] = "Please enter a valid IGN before sending." + redirect_to new_message_path + return + end + if message_params[:text] == "" + flash[:alert] = "Please write a message before sending." + redirect_to new_message_path + return + end + @message = Message.new(message_params) + if @message.save + flash[:notice] = "Message sent!" + redirect_to messages_path + return + else + flash[:alert] = "Something went wrong while creating your message." + render action: "new" + return + end + end + + def new + if !current_user + flash[:alert] = "Please log in to send a private message." + redirect_to blogposts_path + return + end + @message = Message.new + end + + def message_params(add = []) + params[:message][:user_target_id] = User.find_by(ign: params[:message][:user_target].gsub(/[@ ]/,"")).try(:id) + params[:message][:user_sender_id] = User.find_by(ign: params[:message][:user_sender]).id + + params.require(:message).permit([:text, :user_target_id, :user_sender_id]) + end + + private + + def check_permission + @message = Message.find(params[:id]) + unless @message.user_target == current_user + flash[:alert] = "You are not allowed to view this message" + redirect_to home_statics_path + end + end +end diff --git a/app/controllers/threadreplies_controller.rb b/app/controllers/threadreplies_controller.rb index 946155d..dc28638 100644 --- a/app/controllers/threadreplies_controller.rb +++ b/app/controllers/threadreplies_controller.rb @@ -69,4 +69,4 @@ class ThreadrepliesController < ApplicationController def reply_params params.require(:threadreply).permit(:content) end -end \ No newline at end of file +end diff --git a/app/models/comment.rb b/app/models/comment.rb index 35a9a60..951d684 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -61,4 +61,4 @@ class Comment < ActiveRecord::Base background_mailer(mails) end -end \ No newline at end of file +end diff --git a/app/models/message.rb b/app/models/message.rb new file mode 100644 index 0000000..cce952f --- /dev/null +++ b/app/models/message.rb @@ -0,0 +1,20 @@ +class Message < ActiveRecord::Base + + belongs_to :user_sender, class_name: "User", foreign_key: "user_sender_id" + belongs_to :user_target, class_name: "User", foreign_key: "user_target_id" + + validates_presence_of :user_sender, :user_target, :text, on: :create + + def sender + @sender ||= if self.user_sender.present? + user_sender + else + User.first + end + end + + def target + # can be nil + @target ||= user_target + end +end diff --git a/app/models/threadreply.rb b/app/models/threadreply.rb index 47b0d97..f285073 100644 --- a/app/models/threadreply.rb +++ b/app/models/threadreply.rb @@ -64,4 +64,4 @@ class Threadreply < ActiveRecord::Base end background_mailer(mails) end -end \ No newline at end of file +end diff --git a/app/models/user.rb b/app/models/user.rb index c422e28..9ddd4f0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -173,4 +173,4 @@ class User < ActiveRecord::Base def set_email_token self.email_token ||= SecureRandom.hex(16) end -end \ No newline at end of file +end diff --git a/app/views/application/_md_editor.html.erb b/app/views/application/_md_editor.html.erb index 3a18645..ffe1ff1 100644 --- a/app/views/application/_md_editor.html.erb +++ b/app/views/application/_md_editor.html.erb @@ -8,4 +8,4 @@ <%= text_area_tag name, content, options %>
(Loading...)
- \ No newline at end of file + diff --git a/app/views/application/_md_editor_user.html.erb b/app/views/application/_md_editor_user.html.erb new file mode 100644 index 0000000..950b962 --- /dev/null +++ b/app/views/application/_md_editor_user.html.erb @@ -0,0 +1,8 @@ +
+
+ <% options = (defined?(options) && options || {}) %> + <% options[:class] = "#{options[:class]} editor_field" %> + <% options[:placeholder] ||= "Enter user's name. prefix with \"@\" to get suggestions." %> + <%= text_field_tag name, content, options %> +
+
diff --git a/app/views/blogposts/index.html.erb b/app/views/blogposts/index.html.erb index 9dadf42..e838de4 100644 --- a/app/views/blogposts/index.html.erb +++ b/app/views/blogposts/index.html.erb @@ -1,5 +1,7 @@ <% title "News" %> - +<% if current_user %> + <%= link_to "Private Messages (#{Message.where(user_target: current_user).count})", messages_path, class: "btn right blue" %> +<% end %>

News

<%= link_to 'Make new Post', new_blogpost_path, class: "btn blue" if mod? %>
diff --git a/app/views/forums/show.html.erb b/app/views/forums/show.html.erb index 60f3185..6e8ea2f 100644 --- a/app/views/forums/show.html.erb +++ b/app/views/forums/show.html.erb @@ -51,4 +51,4 @@
<% end %> <%= paginate @threads %> - \ No newline at end of file + diff --git a/app/views/forumthreads/edit.html.erb b/app/views/forumthreads/edit.html.erb index 5297249..66ffd80 100644 --- a/app/views/forumthreads/edit.html.erb +++ b/app/views/forumthreads/edit.html.erb @@ -38,4 +38,4 @@

<%= f.submit "Update thread", class: "btn blue left" %>

<% end %> <%= button_to "Delete thread", @thread, :method => "delete", data: {confirm: "Delete thread & comments forever?"}, class: "btn red right" %> -
\ No newline at end of file +
diff --git a/app/views/messages/index.html.erb b/app/views/messages/index.html.erb new file mode 100644 index 0000000..a3d08b2 --- /dev/null +++ b/app/views/messages/index.html.erb @@ -0,0 +1,23 @@ +<%= link_to "Create new message", new_message_path, class: "btn blue right" %> +

Your private messages:

+
+ <% @messages.each do |message| %> +
+
+ <%= link_to(message.user_sender.avatar(64), message.user_sender, title: message.user_sender.ign) %> + <%= render partial: "users/username", locals: { user: message.user_sender } %> + <%= ago message.created_at %> +
+ <%= link_to "Delete message", message, :method => "delete", data: {confirm: "Delete this message forever?"} %> +
+
+
+
+
+ <%= render_md(message.text).html_safe %> +
+
+
+ <% end %> + <%= paginate @messages %> +
diff --git a/app/views/messages/new.html.erb b/app/views/messages/new.html.erb new file mode 100644 index 0000000..e40eb35 --- /dev/null +++ b/app/views/messages/new.html.erb @@ -0,0 +1,19 @@ +

Example Text

+<%= form_for @message do |f| %> + + + + <%= render partial: "md_editor_user", locals: {name: "message[user_target]", content: @message.user_target} %> + + +
+ + + <%= render partial: "md_editor", locals: {name: "message[text]", content: @message.text} %> + + + + <%= f.hidden_field :user_sender, value: current_user %> +
+

<%= f.submit "Send Message", class: "btn blue left" %>

+<% end %> diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 6a6fe4d..1e27977 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -87,4 +87,4 @@ This user has not confirmed his email! <% end %> <% end %> -<% end %> \ No newline at end of file +<% end %> diff --git a/db/migrate/20170524181458_create_messages.rb b/db/migrate/20170524181458_create_messages.rb new file mode 100644 index 0000000..a07fd9d --- /dev/null +++ b/db/migrate/20170524181458_create_messages.rb @@ -0,0 +1,11 @@ +class CreateMessages < ActiveRecord::Migration + def change + create_table :messages do |t| + + t.text :message + t.references :user_sender + t.references :user_target + t.datetime :created_at + end + end +end diff --git a/db/migrate/20170525184355_change_message_to_text.rb b/db/migrate/20170525184355_change_message_to_text.rb new file mode 100644 index 0000000..9bb06a6 --- /dev/null +++ b/db/migrate/20170525184355_change_message_to_text.rb @@ -0,0 +1,5 @@ +class ChangeMessageToText < ActiveRecord::Migration + def change + rename_column :messages, :message, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index 2c68029..9c631a8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,10 +11,10 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160926220738) do +ActiveRecord::Schema.define(version: 20170525184355) do create_table "blogposts", force: :cascade do |t| - t.string "title" + t.string "title", limit: 191 t.text "content", limit: 65535 t.integer "user_author_id", limit: 4 t.integer "user_editor_id", limit: 4 @@ -32,14 +32,14 @@ ActiveRecord::Schema.define(version: 20160926220738) do end create_table "forumgroups", force: :cascade do |t| - t.string "name" + t.string "name", limit: 191 t.integer "position", limit: 4 t.integer "role_read_id", limit: 4 t.integer "role_write_id", limit: 4 end create_table "forums", force: :cascade do |t| - t.string "name" + t.string "name", limit: 191 t.integer "position", limit: 4 t.integer "role_read_id", limit: 4 t.integer "role_write_id", limit: 4 @@ -52,7 +52,7 @@ ActiveRecord::Schema.define(version: 20160926220738) do end create_table "forumthreads", force: :cascade do |t| - t.string "title" + t.string "title", limit: 191 t.text "content", limit: 65535 t.boolean "sticky", default: false t.boolean "locked", default: false @@ -65,33 +65,40 @@ ActiveRecord::Schema.define(version: 20160926220738) do end create_table "info", force: :cascade do |t| - t.string "title" + t.string "title", limit: 191 t.text "content", limit: 65535 t.datetime "created_at" t.datetime "updated_at" end create_table "labels", force: :cascade do |t| - t.string "name" - t.string "color" + t.string "name", limit: 191 + t.string "color", limit: 191 + end + + create_table "messages", force: :cascade do |t| + t.text "text", limit: 65535 + t.integer "user_sender_id", limit: 4 + t.integer "user_target_id", limit: 4 + t.datetime "created_at" end create_table "register_tokens", force: :cascade do |t| - t.string "uuid", null: false - t.string "token", null: false - t.string "email", null: false + t.string "uuid", limit: 32, null: false + t.string "token", limit: 6, null: false + t.string "email", limit: 191, null: false end add_index "register_tokens", ["uuid"], name: "index_register_tokens_on_uuid", unique: true, using: :btree create_table "roles", force: :cascade do |t| - t.string "name" + t.string "name", limit: 191 t.integer "value", limit: 4 - t.string "color" + t.string "color", limit: 191 end create_table "sessions", force: :cascade do |t| - t.string "session_id", null: false + t.string "session_id", limit: 191, null: false t.text "data", limit: 65535 t.datetime "created_at" t.datetime "updated_at" @@ -110,20 +117,20 @@ ActiveRecord::Schema.define(version: 20160926220738) do end create_table "users", force: :cascade do |t| - t.string "uuid", null: false - t.string "name", null: false - t.string "password_digest", null: false - t.string "ign", null: false - t.string "email", null: false + t.string "uuid", limit: 191, null: false + t.string "name", limit: 191, null: false + t.string "password_digest", limit: 191, null: false + t.string "ign", limit: 191, null: false + t.string "email", limit: 191, null: false t.text "about", limit: 65535 - t.string "last_ip" - t.string "skype" + t.string "last_ip", limit: 191 + t.string "skype", limit: 191 t.boolean "skype_public", default: false - t.string "youtube" - t.string "youtube_channelname" - t.string "twitter" + t.string "youtube", limit: 191 + t.string "youtube_channelname", limit: 191 + t.string "twitter", limit: 191 t.boolean "donor", default: false - t.string "email_token" + t.string "email_token", limit: 191 t.boolean "confirmed", default: false t.datetime "last_seen" t.integer "role_id", limit: 4, null: false diff --git a/db/seeds.rb b/db/seeds.rb index 780ddb5..78097d8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -38,4 +38,28 @@ User.create!( password: "123456789", # high seructity! password_confirmation: "123456789", role: Role.get(:superadmin) -) \ No newline at end of file +) +User.create!( + uuid: "7f52491ab5d64c11b4a43806db47a101", + ign: "Yummy_", + name: "Yummy", + email: "yummy@example.com", + password: "123456789", # high seructity! + password_confirmation: "123456789", + role: Role.get(:superadmin) +) +User.create!( + uuid: "62fe35da05ae437ea44b4deae1be1dc4", + ign: "Logal", + email: "logal@example.com", + password: "123456789", # high seructity! + password_confirmation: "123456789", + role: Role.get(:superadmin) +) + +Message.create!( + user_sender_id: 2, + user_target_id: 2, + text: "This is a very long message that I will be using to test a plentitude of things. :)", + created_at: Time.utc(0).to_datetime +)