@@ -24,6 +24,10 @@ func SetupController(route *mux.Route) {
24
24
router .HandleFunc ("/" , CreateEvent ).Methods ("POST" )
25
25
router .HandleFunc ("/" , UpdateEvent ).Methods ("PUT" )
26
26
router .HandleFunc ("/" , GetAllEvents ).Methods ("GET" )
27
+ router .HandleFunc ("/code/{id}/" , GetEventCode ).Methods ("GET" )
28
+ router .HandleFunc ("/code/{id}/" , UpdateEventCode ).Methods ("PUT" )
29
+
30
+ router .HandleFunc ("/checkin/" , Checkin ).Methods ("POST" )
27
31
28
32
router .HandleFunc ("/track/" , MarkUserAsAttendingEvent ).Methods ("POST" )
29
33
router .HandleFunc ("/track/event/{id}/" , GetEventTrackingInfo ).Methods ("GET" )
@@ -103,8 +107,9 @@ func CreateEvent(w http.ResponseWriter, r *http.Request) {
103
107
json .NewDecoder (r .Body ).Decode (& event )
104
108
105
109
event .ID = utils .GenerateUniqueID ()
110
+ var code = utils .GenerateUniqueCode ()
106
111
107
- err := service .CreateEvent (event .ID , event )
112
+ err := service .CreateEvent (event .ID , code , event )
108
113
109
114
if err != nil {
110
115
errors .WriteError (w , r , errors .DatabaseError (err .Error (), "Could not create new event." ))
@@ -145,6 +150,115 @@ func UpdateEvent(w http.ResponseWriter, r *http.Request) {
145
150
json .NewEncoder (w ).Encode (updated_event )
146
151
}
147
152
153
+ /*
154
+ Endpoint to get the code associated with an event (or nil)
155
+ */
156
+ func GetEventCode (w http.ResponseWriter , r * http.Request ) {
157
+ id := mux .Vars (r )["id" ]
158
+
159
+ code , err := service .GetEventCode (id )
160
+
161
+ if err != nil {
162
+ errors .WriteError (w , r , errors .DatabaseError (err .Error (), "Failed to receive event code information from database" ))
163
+ return
164
+ }
165
+
166
+ json .NewEncoder (w ).Encode (code )
167
+ }
168
+
169
+ /*
170
+ Endpoint to update an event code and end time
171
+ */
172
+ func UpdateEventCode (w http.ResponseWriter , r * http.Request ) {
173
+ var eventCode models.EventCode
174
+ json .NewDecoder (r .Body ).Decode (& eventCode )
175
+
176
+ err := service .UpdateEventCode (eventCode .ID , eventCode )
177
+
178
+ if err != nil {
179
+ errors .WriteError (w , r , errors .DatabaseError (err .Error (), "Could not update the code and timestamp of the event." ))
180
+ return
181
+ }
182
+
183
+ updated_event , err := service .GetEventCode (eventCode .ID )
184
+
185
+ if err != nil {
186
+ errors .WriteError (w , r , errors .DatabaseError (err .Error (), "Could not get updated event code and timestamp details." ))
187
+ return
188
+ }
189
+
190
+ json .NewEncoder (w ).Encode (updated_event )
191
+ }
192
+
193
+ /*
194
+ Endpoint to get the code associated with an event (or nil)
195
+ */
196
+ func Checkin (w http.ResponseWriter , r * http.Request ) {
197
+ id := r .Header .Get ("HackIllinois-Identity" )
198
+
199
+ if id == "" {
200
+ errors .WriteError (w , r , errors .MalformedRequestError ("Must provide id in request." , "Must provide id in request." ))
201
+ return
202
+ }
203
+
204
+ var checkin_request models.CheckinRequest
205
+ json .NewDecoder (r .Body ).Decode (& checkin_request )
206
+
207
+ valid , event_id , err := service .CanRedeemPoints (checkin_request .Code )
208
+
209
+ if err != nil {
210
+ errors .WriteError (w , r , errors .DatabaseError (err .Error (), "Failed to receive event code information from database" ))
211
+ return
212
+ }
213
+
214
+ result := models.CheckinResult {
215
+ NewPoints : - 1 ,
216
+ TotalPoints : - 1 ,
217
+ Status : "Success" ,
218
+ }
219
+
220
+ if ! valid {
221
+ result .Status = "InvalidTime"
222
+ }
223
+
224
+ redemption_status , err := service .RedeemEvent (id , event_id )
225
+
226
+ if err != nil || redemption_status == nil {
227
+ errors .WriteError (w , r , errors .UnknownError (err .Error (), "Failed to verify if user already had redeemed event points" ))
228
+ return
229
+ }
230
+
231
+ if redemption_status .Status != "Success" {
232
+ result .NewPoints = 0
233
+ result .Status = "AlreadyCheckedIn"
234
+ json .NewEncoder (w ).Encode (result )
235
+ return
236
+ }
237
+
238
+ // Determine the current event and its point value
239
+
240
+ event , err := service .GetEvent (event_id )
241
+
242
+ if err != nil {
243
+ errors .WriteError (w , r , errors .DatabaseError (err .Error (), "Could not fetch the event details and point value." ))
244
+ return
245
+ }
246
+
247
+ result .NewPoints = event .Points
248
+
249
+ // Add this point value to given profile
250
+ profile , err := service .AwardPoints (id , event .Points )
251
+
252
+ if err != nil {
253
+ errors .WriteError (w , r , errors .UnknownError (err .Error (), "Failed to award user with points" ))
254
+ return
255
+ }
256
+
257
+ result .TotalPoints = profile .Points
258
+
259
+ json .NewEncoder (w ).Encode (result )
260
+ }
261
+
148
262
/*
149
263
Endpoint to get tracking info by event
150
264
*/
0 commit comments