diff --git a/app/assets/javascripts/components/admin/dashboards/general.js.rb b/app/assets/javascripts/components/admin/dashboards/general.js.rb new file mode 100644 index 0000000..423ad4e --- /dev/null +++ b/app/assets/javascripts/components/admin/dashboards/general.js.rb @@ -0,0 +1,46 @@ +module Components + module Admin + module Dashboards + class General < RW + + expose + + def get_initial_state + @blank_control_component = ->{Native(t(:div, {}))} + { + current_control_component: @blank_control_component + } + end + + def render + t(:div, {}, + t(:div, {className: "row"}, + t(:button, {onClick: ->{init_user_creation}}, "add users"), + t(:button, {onClick: ->{init_users_index} }, "list users") + ), + t(:div, {className: "row"}, + t(:div, {className: "container"}, + state.current_control_component.to_n + ) + ) + ) + end + + def init_user_creation + set_state current_control_component: Native(t(Components::Users::New, {on_create: ->(user){on_user_added(user)}, as_admin: true})) + end + + def init_users_index + set_state current_control_component: Native(t(Components::Users::Index, {as_admin: true})) + end + + def on_user_added(user) + msg = Shared::Flash::Message.new(t(:div, {}, link_to("user created press here to show", "/users/show/#{user.id}")), "success") + Components::App::Main.instance.ref(:flash).rb.add_message(msg) + set_state current_control_component: @blank_control_component + end + + end + end + end +end \ No newline at end of file diff --git a/app/assets/javascripts/components/admin/dashboards/main.js.rb b/app/assets/javascripts/components/admin/dashboards/main.js.rb new file mode 100644 index 0000000..93b620e --- /dev/null +++ b/app/assets/javascripts/components/admin/dashboards/main.js.rb @@ -0,0 +1,17 @@ +module Components + module Admin + module Dashboards + class Main < RW + + expose + + def render + t(:div, {}, + children + ) + end + + end + end + end +end \ No newline at end of file diff --git a/app/assets/javascripts/components/dashboards/main.js.rb b/app/assets/javascripts/components/admin/main.js.rb similarity index 82% rename from app/assets/javascripts/components/dashboards/main.js.rb rename to app/assets/javascripts/components/admin/main.js.rb index 8826039..ee9d253 100644 --- a/app/assets/javascripts/components/dashboards/main.js.rb +++ b/app/assets/javascripts/components/admin/main.js.rb @@ -1,7 +1,6 @@ module Components - module Dashboards + module Admin class Main < RW - expose def render @@ -12,4 +11,4 @@ def render end end -end \ No newline at end of file +end diff --git a/app/assets/javascripts/components/admin/users/user_edit.js.rb b/app/assets/javascripts/components/admin/users/user_edit.js.rb new file mode 100644 index 0000000..ae69515 --- /dev/null +++ b/app/assets/javascripts/components/admin/users/user_edit.js.rb @@ -0,0 +1,16 @@ +module Components + module Admin + module Users + class Edit < RW + expose + + def render + t(:div, {}, + t(Components::Users::Edit, {as_admin: true, params: props.params}) + ) + end + + end + end + end +end \ No newline at end of file diff --git a/app/assets/javascripts/components/app/router.js.rb b/app/assets/javascripts/components/app/router.js.rb index b07362d..6bec187 100644 --- a/app/assets/javascripts/components/app/router.js.rb +++ b/app/assets/javascripts/components/app/router.js.rb @@ -44,8 +44,11 @@ def render t(`Route`, {path: "new", component: Components::Images::Create.create_class}) ), - t(`Route`, {path: "/dashboards", component: Components::Dashboards::Main.create_class, onEnter: ->(n, r, cb){check_role(n, r, cb, [:admin])}}, - t(`Route`, {path: "admin", component: Components::Dashboards::Admin.create_class}) + t(`Route`, {path: "/admin", component: Components::Admin::Main.create_class, onEnter: ->(n, r, cb){check_role(n, r, cb, [:admin])}}, + t(`Route`, {path: "dashboards", component: Components::Admin::Dashboards::Main.create_class}, + t(`Route`, {path: "general", component: Components::Admin::Dashboards::General.create_class}) + ), + t(`Route`, {path: "users/:id/edit", component: Components::Admin::Users::Edit.create_class}) ), t(`Route`, {path: "menues/index_edit", component: Components::Menues::IndexEdit.create_class}), diff --git a/app/assets/javascripts/components/dashboards/admin.js.rb b/app/assets/javascripts/components/dashboards/admin.js.rb deleted file mode 100644 index 27a2a32..0000000 --- a/app/assets/javascripts/components/dashboards/admin.js.rb +++ /dev/null @@ -1,44 +0,0 @@ -module Components - module Dashboards - class Admin < RW - - expose - - def get_initial_state - @blank_control_component = ->{Native(t(:div, {}))} - { - current_control_component: @blank_control_component - } - end - - def render - t(:div, {}, - t(:div, {className: "row"}, - t(:button, {onClick: ->{init_user_creation}}, "add users"), - t(:button, {onClick: ->{init_users_index} }, "list users") - ), - t(:div, {className: "row"}, - t(:div, {className: "container"}, - state.current_control_component.to_n - ) - ) - ) - end - - def init_user_creation - set_state current_control_component: Native(t(Components::Users::New, {on_create: ->(user){on_user_added(user)}})) - end - - def init_users_index - set_state current_control_component: Native(t(Components::Users::Index)) - end - - def on_user_added(user) - msg = Shared::Flash::Message.new(t(:div, {}, link_to("user created press here to show", "/users/show/#{user.id}")), "success") - Components::App::Main.instance.ref(:flash).rb.add_message(msg) - set_state current_control_component: @blank_control_component - end - - end - end -end \ No newline at end of file diff --git a/app/assets/javascripts/components/forms/select.js.rb b/app/assets/javascripts/components/forms/select.js.rb index 19d1748..7211ddd 100644 --- a/app/assets/javascripts/components/forms/select.js.rb +++ b/app/assets/javascripts/components/forms/select.js.rb @@ -89,7 +89,8 @@ def render t(:p, {}, *splat_each(state.selected) do |selected| t(:span, {className: "label label-default", style: {cursor: "pointer"}, onClick: ->{delete(selected)}}, - if @serialize_value + if @serialize_value + next if selected.attributes[:_destroy] "#{selected.attributes[props.serialize_value[:value_attr]]} X" else "#{selected} X" @@ -117,9 +118,11 @@ def delete(selected) if @serialize_value if selected.arbitrary[:initially_selected] selected.attributes[:_destroy] = "1" + state.options << selected end + else + state.options << state.selected.delete(selected) end - state.options << state.selected.delete(selected) set_state options: state.options end diff --git a/app/assets/javascripts/components/pages/edit.js.rb b/app/assets/javascripts/components/pages/edit.js.rb index 9d2dfb0..9b52a0a 100644 --- a/app/assets/javascripts/components/pages/edit.js.rb +++ b/app/assets/javascripts/components/pages/edit.js.rb @@ -16,7 +16,7 @@ def get_initial_state end def component_did_mount - Page.show({id: props.params.id}).then do |page| + Page.show(wilds: {id: props.params.id}).then do |page| set_state form_model: page end.fail do |res| alert res diff --git a/app/assets/javascripts/components/pages/index.js.rb b/app/assets/javascripts/components/pages/index.js.rb index 8bc56e7..a352530 100644 --- a/app/assets/javascripts/components/pages/index.js.rb +++ b/app/assets/javascripts/components/pages/index.js.rb @@ -16,7 +16,7 @@ def get_initial_state end def component_did_mount - Page.index({component: self}, {extra_params: {per_page: 1}}).then do |pages| + Page.index(component: self, extra_params: {per_page: 1}).then do |pages| extract_pagination(pages) #p pages.pure_attributes set_state pages: pages @@ -44,7 +44,7 @@ def render end def pagination_switch_page(_page, per_page) - Page.index({},{extra_params: {page: _page, per_page: per_page}}).then do |pages| + Page.index(extra_params: {page: _page, per_page: per_page}).then do |pages| extract_pagination(pages) set_state pages: pages end diff --git a/app/assets/javascripts/components/pages/show.js.rb b/app/assets/javascripts/components/pages/show.js.rb index f981fdf..97019b5 100644 --- a/app/assets/javascripts/components/pages/show.js.rb +++ b/app/assets/javascripts/components/pages/show.js.rb @@ -11,7 +11,7 @@ def get_initial_state def component_did_mount page_to_query = (x = props.page_id) ? x : props.params.id - Page.show({id: page_to_query, component: self}).then do |page| + Page.show(wilds: {id: page_to_query}, component: self).then do |page| set_state page: page end.fail do |resp| raise resp diff --git a/app/assets/javascripts/components/users/edit.js.rb b/app/assets/javascripts/components/users/edit.js.rb index 4bf3a3b..7fd3763 100644 --- a/app/assets/javascripts/components/users/edit.js.rb +++ b/app/assets/javascripts/components/users/edit.js.rb @@ -13,10 +13,11 @@ def get_initial_state def component_did_mount id = props.params.id - unless CurrentUser.user_instance.id == id.to_i || CurrentUser.user_instance.has_role?(:admin) + @as_admin = props.as_admin ? {namespace: "admin"} : {} + unless CurrentUser.user_instance.id == id.to_i || props.as_admin props.history.replaceState({}, "/forbidden") else - User.show({id: id}).then do |form_model| + User.edit({wilds: {id: id}}.merge(@as_admin)).then do |form_model| set_state form_model: form_model end end @@ -36,7 +37,7 @@ def render t(:p, {}, "email: #{state.form_model.email}"), t(:button, {onClick: ->{init_auth_data_edit}}, "edit login credentials"), input(Forms::Input, state.form_model.profile, :bio), - if CurrentUser.user_instance.has_role?(:admin) + if props.as_admin input(Forms::Select, state.form_model, :roles, { serialize_value: {model_name: "role", value_attr: "name"}, multiple: true, server_feed: {url: "/api/users/roles_feed"} }) end, @@ -49,8 +50,9 @@ def render def handle_inputs collect_inputs + p state.form_model.pure_attributes unless state.form_model.has_errors? - state.form_model.update({}, {serialize_as_form: true}).then do |model| + state.form_model.update({serialize_as_form: true}.merge(@as_admin)).then do |model| unless model.has_errors? msg = Shared::Flash::Message.new(t(:div, {}, "updated successfully")) Components::App::Main.instance.ref(:flash).rb.add_message(msg) diff --git a/app/assets/javascripts/components/users/index.js.rb b/app/assets/javascripts/components/users/index.js.rb index 24d8227..c604581 100644 --- a/app/assets/javascripts/components/users/index.js.rb +++ b/app/assets/javascripts/components/users/index.js.rb @@ -16,7 +16,8 @@ def get_initial_state end def component_did_mount - User.index({}, {extra_params: {per_page: 25}}).then do |users| + @as_admin = props.as_admin ? {namespace: "admin"} : {} + User.index({extra_params: {per_page: 25}}.merge(@as_admin)).then do |users| extract_pagination(users) set_state users: users end @@ -55,7 +56,8 @@ def render end def edit_selected(user) - Components::App::Router.history.replaceState({}, "/users/edit/#{user.id}") + url = props.as_admin ? "/admin/users/#{user.id}/edit" : "/users/edit/#{user.id}" + Components::App::Router.history.pushState({}, url) end def destroy_selected(_user) diff --git a/app/assets/javascripts/components/users/new.js.rb b/app/assets/javascripts/components/users/new.js.rb index ac45788..36f53ee 100644 --- a/app/assets/javascripts/components/users/new.js.rb +++ b/app/assets/javascripts/components/users/new.js.rb @@ -10,7 +10,7 @@ class New < RW def prepare_new_user ->{ - User.new(profile: {profile: {}}, avatar: {avatar: {}}) + User.new(profile: {profile: {}}, avatar: {avatar: {}}, roles: []) } end @@ -33,7 +33,8 @@ def render if state.current_user.has_role? :admin t(:div, {}, t(:p, {}, "choose roles"), - input(Forms::Select, state.form_model, :roles_array, {multiple: true, server_feed: {url: "/api/users/roles_feed"}}) + input(Forms::Select, state.form_model, :roles, {multiple: true, server_feed: {url: "/api/users/roles_feed"}, + serialize_value: {model_name: "role", value_attr: "name"}}) ) end, t(:br, {}), @@ -46,7 +47,7 @@ def render def handle_inputs collect_inputs unless state.form_model.has_errors? - state.form_model.create({}, {serialize_as_form: true}).then do |model| + state.form_model.create(serialize_as_form: true, namespace: "admin").then do |model| if model.has_errors? set_state form_model: model else diff --git a/app/assets/javascripts/components/users/show.js.rb b/app/assets/javascripts/components/users/show.js.rb index 2bb447c..9f3beda 100644 --- a/app/assets/javascripts/components/users/show.js.rb +++ b/app/assets/javascripts/components/users/show.js.rb @@ -10,7 +10,7 @@ def get_initial_state end def component_did_mount - User.show({id: props.params.id}).then do |user| + User.show(wilds: {id: props.params.id}).then do |user| set_state user: user end.fail do |response| `console.log("error:")` diff --git a/app/assets/javascripts/controllers/users_controller.js.rb b/app/assets/javascripts/controllers/users_controller.js.rb index 417e8b2..6b3530b 100644 --- a/app/assets/javascripts/controllers/users_controller.js.rb +++ b/app/assets/javascripts/controllers/users_controller.js.rb @@ -3,7 +3,7 @@ class UsersController < BaseController def handle_signup_submit c.collect_inputs unless c.state.form_model.has_errors? - c.state.form_model.sign_up({yield_response: true}, payload: {user: c.state.form_model.attributes}).then do |response| + c.state.form_model.sign_up(yield_response: true, payload: {user: c.state.form_model.attributes}).then do |response| if e = response.json[:user][:errors] c.state.form_model.errors = e c.set_state form_model: c.state.form_model @@ -23,7 +23,7 @@ def handle_signup_submit def login c.collect_inputs(validate_only: [nil]) unless c.state.form_model.has_errors? - CurrentUser.login({}, payload: {session: c.state.form_model.attributes}).then do |response| + CurrentUser.login(payload: {session: c.state.form_model.attributes}).then do |response| if x = response[:errors] c.set_state message: x else @@ -38,7 +38,7 @@ def login def send_password_reset_email c.collect_inputs unless c.state.form_model.has_errors? - CurrentUser.request_password_reset({}, payload: {password_reset: c.state.form_model.attributes}).then do |response| + CurrentUser.request_password_reset(payload: {password_reset: c.state.form_model.attributes}).then do |response| c.set_state message: "instructions were sent to you" end.fail do |response| c.state.form_model.errors = response[:errors] @@ -52,7 +52,7 @@ def send_password_reset_email def update_new_password c.collect_inputs(validate_only: [:password, :password_confirmation]) unless c.state.form_model.has_errors? - CurrentUser.update_new_password({id: c.state.id}, payload: {user: c.state.form_model.attributes, email: c.state.email}).then do |response| + CurrentUser.update_new_password(wilds: {id: c.state.id}, payload: {user: c.state.form_model.attributes, email: c.state.email}).then do |response| Components::App::Router.history.pushState(nil, "/users/show/#{CurrentUser.user_instance.id}") end.fail do |response| c.set_state message: "error" diff --git a/app/assets/javascripts/front_models/user.js.rb b/app/assets/javascripts/front_models/user.js.rb index 618f1ad..25bdd0a 100644 --- a/app/assets/javascripts/front_models/user.js.rb +++ b/app/assets/javascripts/front_models/user.js.rb @@ -19,6 +19,8 @@ class User < Model route "Index", get: "users" route "destroy", {delete: "users/:id"}, {defaults: [:id]} + + route "Edit", {get: "users/:id/edit"} has_one :profile, :avatar has_many :roles diff --git a/app/assets/javascripts/plugins/depends_on_current_user.js.rb b/app/assets/javascripts/plugins/depends_on_current_user.js.rb index b413a92..cc2c295 100644 --- a/app/assets/javascripts/plugins/depends_on_current_user.js.rb +++ b/app/assets/javascripts/plugins/depends_on_current_user.js.rb @@ -3,7 +3,7 @@ module DependsOnCurrentUser def component_will_mount state.current_user = User.new - CurrentUser.get_current_user({}, {extra_params: {roles: self.class.roles_to_fetch}}).then do |user| + CurrentUser.get_current_user(extra_params: {roles: self.class.roles_to_fetch}).then do |user| if user.is_a? User depends_on_current_user_loaded(user) if self.respond_to? :user_loaded CurrentUser.user_instance = user diff --git a/app/assets/javascripts/vendor/model.js.rb b/app/assets/javascripts/vendor/model.js.rb index 28afb90..0871797 100644 --- a/app/assets/javascripts/vendor/model.js.rb +++ b/app/assets/javascripts/vendor/model.js.rb @@ -384,13 +384,13 @@ def self.associations(*args) =end def self.route(name, method_and_url, options ={}) if name[0] == name.capitalize[0] - self.define_singleton_method(name.downcase) do | wilds = {}, req_options = {}| - RequestHandler.new(self, name, method_and_url, options, wilds, req_options).promise + self.define_singleton_method(name.downcase) do |req_options = {}|#| wilds = {}, req_options = {}| + RequestHandler.new(self, name, method_and_url, options, req_options).promise end else #route :save, post: "pages/:id", defaults: [:id] - self.define_method(name) do |wilds = {}, req_options = {}| - RequestHandler.new(self, name, method_and_url, options, wilds, req_options).promise + self.define_method(name) do |req_options = {}|#|wilds = {}, req_options = {}| + RequestHandler.new(self, name, method_and_url, options, req_options).promise end end end @@ -426,6 +426,10 @@ def self.responses_on_show(r) end end + def self.responses_on_edit(r) + self.responses_on_show(r) + end + def on_before_update(r) r.req_options = {payload: pure_attributes} end @@ -639,32 +643,33 @@ class RequestHandler attr_accessor :caller, :promise, :name, :response, :req_options - def initialize(caller, name, method_and_url, options, wilds, req_options) + def initialize(caller, name, method_and_url, options, req_options = {}) @caller = caller #the model that called either instance or class @name = name #name of the route @options = options - @wilds = wilds + @wilds = req_options[:wilds] || {} #handy little :foo s #as well as options holder like #yield_response: true => will override default response handlers #component: component's self => will make RW comonent available #TODO: should wilds be renamed now? they're more options now than wilds as back then when they were young and silly little args - @component = wilds[:component] + @component = req_options[:component] #if you need to pass component to Http (e.g. turn on spinner before request, swith off after) #or any other sort of that #pass component in first arg like #user.some_route({component: self}) #and youll have access to it in automatic response handlers (or anywhere in requesthandler) - @should_yield_response = wilds[:yield_response] + @should_yield_response = req_options[:yield_response] #handy if you need unprocessed response #e.g. simply pass user.some_route({yield_response: true}, {}) {|response| unprocessed response} - @skip_before_handler = wilds[:skip_before_handler] + @skip_before_handler = req_options[:skip_before_handler] #if you need to override defualts before request is made #pass this option to wild as {skip_before_handler: true} #else it's false by defaul - @url = prepare_http_url_for(method_and_url) + name_space = req_options[:namespace] || false + @url = prepare_http_url_for(method_and_url, name_space) #makes youre route get: "url/:foo", #passes default for wilds, or attaches one from wilds option @@ -692,14 +697,12 @@ def initialize(caller, name, method_and_url, options, wilds, req_options) @req_options[:processData] = false @req_options[:contentType] = false #For info on this method refer to validation part of model - else - @req_options = {payload: @req_options} end #TODO: NEED TO THROUGHLY PLAN AND STANDARTIZE THE OPTIONS THAT CAN BE PASSED FOR REQUEST! send_request end - def prepare_http_url_for(method_and_url) + def prepare_http_url_for(method_and_url, name_space) url = method_and_url[method_and_url.keys[0]].split('/') url.map! do |part| if part[0] == ":" @@ -713,6 +716,9 @@ def prepare_http_url_for(method_and_url) end #TODO: raise if route is defined with wild but no wild was resolved defaultly or not was given through wild arg end + if name_space + url.unshift(name_space) + end url.unshift('api') #adds prefix to url as apiv1/url #TODO: move to as constant of Model diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb new file mode 100644 index 0000000..994354d --- /dev/null +++ b/app/controllers/admin/users_controller.rb @@ -0,0 +1,65 @@ +class Admin::UsersController < ApplicationController + + def show + + @perms = perms_for :User + + auth! @perms.admin_show + + render json: @perms.model + + end + + def index + + @perms = perms_for :User + + auth! @perms.admin_index + + render json: @perms.model + + end + + def create + + perms_for :User #added !standart_auth + auth! @perms.admin_create #added !standart_auth + #render json: @perms.permitted_attributes and return + @user = User.new(@perms.permitted_attributes) + + if @user.save + render json: @user.as_json(only: [:id, :email]) + end + + end + + def edit + + @perms = perms_for :User + + auth! @perms.admin_edit + + render json: @perms.model + + end + + def update + @perms = perms_for :User + + auth! @perms.admin_update + + @user = User.find(params[:id]) + + @user.update_attributes(@perms.permitted_attributes) + if @user.save + render json: @user.as_json(only: [:email, :id], + include: {profile: {root: true, only: [:id, :name, :bio, :user_id]}, + avatar: {root: true, only: [:id], methods: [:url]}}) + else + render json: @user.as_json(only: [:email, :id], methods: [:errors], + include: {profile: {root: true, only: [:id, :user_id, :name, :bio]}, + avatar: {root: true, only: [:id], methods: [:url]}}) + end + end + +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index dbe4880..e7aec3f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -16,18 +16,12 @@ def create #render json: @perms.permitted_attributes and return @user = User.new(@perms.permitted_attributes) - if @perms.arbitrary[:as_admin] #added !standart_auth - @perms.arbitrary[:roles_array].each do |role| # - @user.add_role role # - end # - end - if @user.save if User::ACTIVATABLE @user.send_activation_email render json: @user.as_json(only: [:id, :email]) else - log_in @user unless @perms.arbitrary[:as_admin] #modified starting from unless + log_in @user #remember user render json: @user.as_json(only: [:id, :email]) end @@ -37,8 +31,7 @@ def create end def create_user_params - #params.require(:user).permit(:email, :password, :password_confirmation) DEFAULT AUTHENTICATION. FOR PURE UNCOMMENT AND DELETE REST OF METHOD - params.require(:user).permit(:email, :password, :password_confirmation, avatar_attributes: [:file], profile_attributes: [:name, :bio] ) + params.require(:user).permit(:email, :password, :password_confirmation) #DEFAULT AUTHENTICATION. FOR PURE UNCOMMENT AND DELETE REST OF METHOD end # Confirms a logged-in user. @@ -89,6 +82,16 @@ def show end + def edit + + @perms = perms_for :User + + auth! @perms + + render json: @perms.model + + end + def destroy @perms = perms_for :User auth! @perms @@ -99,6 +102,7 @@ def destroy end def update + @perms = perms_for :User auth! @perms diff --git a/app/permission_system/perms/user.rb b/app/permission_system/perms/user.rb index c5378c1..babf7b0 100644 --- a/app/permission_system/perms/user.rb +++ b/app/permission_system/perms/user.rb @@ -2,14 +2,17 @@ module Perms class User < Perms::Base def create + @permitted_attributes = @controller.params.require(:user).permit(:email, :password, :password_confirmation, profile_attributes: [:name, :bio], avatar_attributes: [:file]) + end + #******************** + + def admin_create if @controller.current_user && @controller.current_user.has_any_role?(:admin, :root) @permitted_attributes = @controller.params.require(:user). - permit(:email, :password, :password_confirmation, avatar_attributes: [:file], profile_attributes: [:name, :bio], roles_array: [] ) - @arbitrary = {as_admin: true, roles_array: @permitted_attributes.delete(:roles_array)} - @current_user.has_any_role? :admin, :root - else - @permitted_attributes = @controller.params.require(:user).permit(:email, :password, :password_confirmation, profile_attributes: [:name, :bio], avatar_attributes: [:file]) - end + permit(:email, :password, :password_confirmation, avatar_attributes: [:file], + profile_attributes: [:name, :bio], roles_attributes: [:name] ) + + end end @@ -17,38 +20,44 @@ def create def index per_page = params[:per_page] || 25 - if @current_user && @current_user.has_any_role?(:admin, :root) + + @model = ::User.includes(:profile_id_name, :avatar).all.paginate(page: params[:page], per_page: 10) - @model = ::User.includes(:profile_id_name, :avatar, :roles).all.paginate(page: params[:page], per_page: per_page) - @model = @model.as_json( only: ::User::EXPOSABLE_ATTRIBUTES, include: { - avatar: { root: true, only: [:id], methods: [:url]}, - profile: { root: true, only: [:id, :name]}, - roles: { root: true, only: [:name] } + avatar: { root: true, only: [:id], methods: [:url] }, + profile: { root: true, only: [:id, :name]} } ) << @controller.extract_pagination_hash(@model) - else + end + #******************** - @model = ::User.includes(:profile_id_name, :avatar).all.paginate(page: params[:page], per_page: 10) + def admin_index + + per_page = params[:per_page] || 25 + + if @current_user && @current_user.has_any_role?(:admin, :root) + @model = ::User.includes(:profile_id_name, :avatar, :roles).all.paginate(page: params[:page], per_page: per_page) + @model = @model.as_json( - only: User::EXPOSABLE_ATTRIBUTES, + only: ::User::EXPOSABLE_ATTRIBUTES, include: { - avatar: { root: true, only: [:id], methods: [:url] }, - profile: { root: true, only: [:id, :name]} + avatar: { root: true, only: [:id], methods: [:url]}, + profile: { root: true, only: [:id, :name]}, + roles: { root: true, only: [:name] } } ) << @controller.extract_pagination_hash(@model) - end - end - #******************** + end + + #*********** def destroy - @current_user && @current_user.has_any_role?(:admin, :root) + @current_user.has_any_role?(:admin, :root) end #********************* @@ -56,15 +65,40 @@ def destroy def update if ::User.find(params[:id]).id == @current_user.try(:id) @permitted_attributes = params.require(:user).permit(:email, :password, :password_confirmation, avatar_attributes: [:file, :id, :user_id], profile_attributes: [:name, :bio, :id, :user_id]) - else - false end end #******************** + + def admin_update + if @current_user.has_any_role? :admin, :root + @permitted_attributes = params.require(:user).permit(:email, :password, :password_confirmation, + avatar_attributes: [:file, :id, :user_id], + profile_attributes: [:name, :bio, :id, :user_id], + roles_attributes: [:name, :id, :user_id, :_destroy]) + end + end + + + #************** def show + @model = ::User.includes(:profile, :avatar).find(@controller.params[:id]) + + @model = @model.as_json( + only: ::User::EXPOSABLE_ATTRIBUTES, + include: { + avatar: { root: true, only: [:id, :user_id], methods: [:url] }, + profile: { root: true, only: [:id, :name, :bio, :user_id]} + } + ) + + @model + + end + + def admin_show if @current_user && @current_user.has_role?(:admin) @model = ::User.includes(:profile, :avatar, :roles).find(@controller.params[:id]) @@ -79,9 +113,13 @@ def show ) @model + end + end - else + #******************** + def edit + if @current_user.id.to_s == params[:id] @model = ::User.includes(:profile, :avatar).find(@controller.params[:id]) @model = @model.as_json( @@ -92,11 +130,29 @@ def show } ) - @model - + @model end + end + def admin_edit + + if @current_user && @current_user.has_role?(:admin) + + @model = ::User.includes(:profile, :avatar, :roles).find(@controller.params[:id]) + + @model = @model.as_json( + only: ::User::EXPOSABLE_ATTRIBUTES, + include: { + avatar: { root: true, only: [:id, :user_id], methods: [:url]}, + profile: { root: true, only: [:id, :name, :bio, :user_id]}, + roles: { root: true, only: [:name, :id] } + } + ) + + @model + end end + end end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index aa84d0f..ae73f1e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,6 +26,10 @@ post "users/roles_feed" => "users#roles_feed" + namespace :admin do + resources :users + end + end get "/console" => "faker#console" diff --git a/test/controllers/admin/users_controller_test.rb b/test/controllers/admin/users_controller_test.rb new file mode 100644 index 0000000..a0352fc --- /dev/null +++ b/test/controllers/admin/users_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Admin::UsersControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end