feature/share-libs
rb 163 lines 3.95 KB
Raw
1 # frozen_string_literal: true
2
3 require 'gem_error_codes'
4
5 module Api
6 module V1
7 class UserController < Devise::SessionsController
8 skip_before_action :verify_authenticity_token
9 respond_to :json
10
11 def login
12 find_user
13 return render_error(GemErrorCodes.user_not_found, GemErrorCodes.user_not_found_message, :not_found) unless @user
14
15 if @user&.valid_password?(params[:password])
16 logger.debug 'User logged in.'
17 sign_in(:user, @user)
18 render_success
19 else
20 logger.debug 'Invalid credentials.'
21 render_error(GemErrorCodes.invalid_credentials, GemErrorCodes.invalid_credentials_message, :unauthorized)
22 end
23 end
24
25 def logout
26 log_out_success && return if current_user
27
28 log_out_failure
29 end
30
31 def register
32 name = params[:name]
33 email = params[:email]
34 password = params[:password]
35
36 unless !name.nil? && !name.empty? && !email.nil? && !email.empty? && !password.nil? && !password.empty?
37 render_error 'Please fill name, email, and password.'
38 return
39 end
40
41 @user = User.new(
42 name: name,
43 email: email,
44 password: password
45 )
46
47 if @user.save
48 # Deliver the signup email.
49 UserNotifierMailer.send_signup_email(@user).deliver
50 render_success
51 else
52 # Get Devise proper error response.
53 render_error 'Something wrong with the registration process. Try again later.'
54 end
55 end
56
57 def profile
58 find_user
59 if @user
60 render_success
61 else
62 render_error 'Unknown user.'
63 end
64 end
65
66 def following
67 find_user
68 if @user
69 render_user_following
70 else
71 render_error 'Unknown user.'
72 end
73 end
74
75 def followers
76 find_user
77 if @user
78 render_user_followers
79 else
80 render_error 'Unknown user.'
81 end
82 end
83
84 def community
85 username_to_exclude = params[:exclude]
86 users = User.all.order(created_at: :asc)
87 @filtered_users = users.reject(username_to_exclude)
88
89 if @filtered_users
90 render_community
91 else
92 render_error 'Unknown error.'
93 end
94 end
95
96 private
97
98 def find_user
99 username = params[:username].downcase
100 @user = User.find_by(username: username) || User.find_by(email: username) || User.find_by(id: username)
101 end
102
103 def render_success
104 render json: {
105 code: 200,
106 message: 'OK.',
107 user: @user.as_json_packed
108 }, status: :ok
109 end
110
111 def render_error(error_code, message, status = :unauthorized)
112 render json: {
113 error_code: error_code,
114 message: message
115 }, status: status
116 end
117
118 def render_user_following
119 render json: {
120 code: 200,
121 message: 'OK.',
122 user: @user.as_json_packed,
123 following: @user.following.map(&:as_json_packed)
124 }
125 end
126
127 def render_user_followers
128 render json: {
129 code: 200,
130 message: 'OK.',
131 user: @user.as_json_packed,
132 followers: @user.followers.map(&:as_json_packed)
133 }
134 end
135
136 def render_community
137 render json: {
138 code: 200,
139 message: 'OK.',
140 users: @filtered_users.map(&:as_json_packed)
141 }
142 end
143
144 def respond_with(_resource, _opts = {})
145 render json: { message: 'You are logged in.' }, status: :ok
146 end
147
148 def respond_to_on_destroy
149 log_out_success && return if current_user
150
151 log_out_failure
152 end
153
154 def log_out_success
155 render json: { message: 'You are logged out.' }, status: :ok
156 end
157
158 def log_out_failure
159 render json: { message: 'Hmm nothing happened.' }, status: :unauthorized
160 end
161 end
162 end
163 end