forked from BadgerGroup/BadgerAPI
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQLHelper.rb
More file actions
240 lines (218 loc) · 6.11 KB
/
SQLHelper.rb
File metadata and controls
240 lines (218 loc) · 6.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
require 'active_record' # for managing model objects
require_relative 'User'
require_relative 'Group'
require_relative 'Badge'
require_relative 'Friend'
# class that handles all I/O for database.
class SQLHelper < ActiveRecord::Migration
SQLUsername = 'badgeradmin'
SQLPassword = 'AppBadger1!'
HARD_ERR = {:error => "There was a problem with the API."}
# connect to the SQL database
def initialize
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "badgerdb.cz2y13cetnjg.us-west-2.rds.amazonaws.com",
:username => SQLUsername,
:password => SQLPassword,
:database => "BadgerDB"
)
end
def fatalError(exception)
puts exception
File.open("log.txt", "a") do |f|
f.puts exception
f.puts exception.backtrace
end
return HARD_ERR
end
def getFirstUser
user = User.find(1)
user.username
end
def getUserById(id)
begin
user = User.find(id)
rescue ActiveRecord::RecordNotFound
return {:error => "User not found."}
rescue Exception => e
self.fatalError e
HARD_ERR
else
puts user.inspect
user.toArray
end
end
# return user info given a username
def getUserByUsername(name)
begin
user = User.find_by username: name
if user.nil?
return {:error => "User not found."}
else
user.toArray
end
end
end
# find and authenticate the user with the given credentials
def login(name, password)
user = User.find_by username: name
if user.nil?
return {:error => "No records exist for that username."}
else
if user.authenticate password
return user.toArray
else
return {:error => "Incorrect password."}
end
end
end
def getGroupById(id)
begin
group = Group.find(id)
rescue ActiveRecord::RecordNotFound
return {:error => "Group not found."}
rescue Exception => e
self.fatalError e
HARD_ERR
else
group.toArray
end
end
# permanently delete a user from the database
def deleteUser(id)
user = User.find(id)
rescue ActiveRecord::RecordNotFound
return {:error => "User not found."}
rescue Exception => e
self.fatalError e
HARD_ERR
else
user.destroy # `destroy` checks for dependencies (badges, groups)
return {:response => "User with id #{id} deleted."}
end
# get the badge object with the given id
def getBadgeById(id)
begin
badge = Badge.find(id)
rescue ActiveRecord::RecordNotFound
return {:error => "Badge not found."}
rescue Exception => e
self.fatalError e
HARD_ERR
else
badge.toArray
end
end
# create a new user with the given credentials
def createUser(name, password, passwordConfirmation, email)
begin
user = User.create!(:username => name, :password => password, :email => email, :password_confirmation => passwordConfirmation) #throws exception if invalid
rescue ActiveRecord::RecordNotUnique => e
return {:error => "Username or email already exists."}
rescue ActiveRecord::RecordInvalid => ri
return {:error => ri}
rescue Exception => ex
self.fatalError ex
HARD_ERR
else
user.toArray
end
end
# add a friend to the given user, also adds in reverse direction
def addFriend(userId, friendId)
user = User.find(userId)
User.find(friendId)
if user.friends.exists?(friendId)
return {:error => "Users are already friends."}
end
Friend.create(:user_id => userId, :friend_id => friendId)
Friend.create(:user_id => friendId, :friend_id => userId)
return {:response => "Success"}
rescue ActiveRecord::RecordNotFound
return {:error => "User and/or friend not found."}
end
# update user with given credentials
def updateUser(args)
if args['id'] then
userId = args['id']
user = User.find(userId)
user.update! args
return {:response => "Record updated."}
else
return {:error => "'id' is required."}
end
rescue ActiveRecord::RecordInvalid => ri
return {:error => ri}
rescue Exception => e
self.fatalError e
HARD_ERR
end
def updateBadge(args)
if args['id'] then
badgeId = args['id']
badge = Badge.find(badgeId)
puts "ARG: #{args['is_new']}"
badge.update! args
if args['recipient_id'] then
badge.is_new = true
end
return {:response => "Record updated."}
else
return {:error => "'id' is required."}
end
rescue ActiveRecord::RecordInvalid => ri
return {:error => ri}
rescue Exception => e
self.fatalError e
HARD_ERR
end
# create a new group
def createGroup(name, description, adminId)
group = Group.create(:group_name => name, :group_description => description, :admin_id => adminId)
rescue ActiveRecord::RecordInvalid => ri
return {:error => ri}
rescue Exception => e
self.fatalError e
HARD_ERR
else
group.toArray
end
# create a new badge with given properties
def createBadge(imageURL, name, description, authorId)
user = User.find(authorId)
badge = Badge.create(:image_url => imageURL, :badge_name => name, :badge_description => description, :author_id => user.id)
rescue ActiveRecord::RecordInvalid => ri
return {:error => ri}
rescue Exception => e
self.fatalError e
HARD_ERR
else
badge.toArray
end
# adds a user to the given group
def addUserToGroup(userId, groupId)
user = User.find(userId)
group = Group.find(groupId)
user.groups << group
rescue ActiveRecord::RecordNotUnique => rnu
return {:error => "User already member of group."}
rescue ActiveRecord::RecordNotFound
return {:error => "User/group not found."}
rescue Exception => e
self.fatalError e
return HARD_ERR
else
return {:response => 'User added to group.', :user_id => userId, :group_id => groupId}
end
# removes a given user from a given group
def removeUserFromGroup(userId, groupId)
user = User.find(userId)
group = Group.find(groupId)
user.groups.delete(group)
rescue ActiveRecord::RecordNotFound
return {:error => "User/group not found."}
else
return {:response => 'User removed from group.', :user_id => userId, :group_id => groupId}
end
end