freckie

Update

...@@ -57,7 +57,7 @@ func (e *Endpoints) CellGet(w http.ResponseWriter, r *http.Request, ps httproute ...@@ -57,7 +57,7 @@ func (e *Endpoints) CellGet(w http.ResponseWriter, r *http.Request, ps httproute
57 } 57 }
58 58
59 // Check Permission 59 // Check Permission
60 - var _count int64 60 + var _count, isSuper int64
61 timetable := fmt.Sprintf("%s,%s", fileID, sheetID) 61 timetable := fmt.Sprintf("%s,%s", fileID, sheetID)
62 row := e.DB.QueryRow(` 62 row := e.DB.QueryRow(`
63 SELECT count(timetable_id) 63 SELECT count(timetable_id)
...@@ -72,17 +72,15 @@ func (e *Endpoints) CellGet(w http.ResponseWriter, r *http.Request, ps httproute ...@@ -72,17 +72,15 @@ func (e *Endpoints) CellGet(w http.ResponseWriter, r *http.Request, ps httproute
72 } 72 }
73 73
74 row = e.DB.QueryRow(` 74 row = e.DB.QueryRow(`
75 - SELECT count(a.timetable_id) 75 + SELECT is_super FROM users WHERE email=?
76 - FROM allowlist AS a, users AS u 76 + `, email)
77 - WHERE a.user_id=u.id 77 + if err := row.Scan(&isSuper); err != nil {
78 - AND a.timetable_id=? 78 + if err == sql.ErrNoRows {
79 - AND u.email=?; 79 + functions.ResponseError(w, 401, "해당 유저가 존재하지 않음")
80 - `, timetable, email)
81 - if err := row.Scan(&_count); err == nil {
82 - if _count <= 0 {
83 - functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.")
84 return 80 return
85 } 81 }
82 + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
83 + return
86 } 84 }
87 85
88 // Result Resp 86 // Result Resp
......
...@@ -29,7 +29,7 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h ...@@ -29,7 +29,7 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h
29 sheetID := ps.ByName("sheet_id") 29 sheetID := ps.ByName("sheet_id")
30 30
31 // Check Permission 31 // Check Permission
32 - var _count, _isSuper int64 32 + var _count int64
33 timetable := fmt.Sprintf("%s,%s", fileID, sheetID) 33 timetable := fmt.Sprintf("%s,%s", fileID, sheetID)
34 row := e.DB.QueryRow(` 34 row := e.DB.QueryRow(`
35 SELECT count(timetable_id) 35 SELECT count(timetable_id)
...@@ -43,31 +43,31 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h ...@@ -43,31 +43,31 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h
43 } 43 }
44 } 44 }
45 45
46 - row = e.DB.QueryRow(` 46 + // row = e.DB.QueryRow(`
47 - SELECT ( 47 + // SELECT (
48 - SELECT count(a.timetable_id) 48 + // SELECT count(a.timetable_id)
49 - FROM allowlist AS a, users AS u 49 + // FROM allowlist AS a, users AS u
50 - WHERE a.user_id=u.id 50 + // WHERE a.user_id=u.id
51 - AND a.timetable_id=? 51 + // AND a.timetable_id=?
52 - AND u.email=? 52 + // AND u.email=?
53 - ) AS count, 53 + // ) AS count,
54 - ( 54 + // (
55 - SELECT is_super FROM users WHERE email=? 55 + // SELECT is_super FROM users WHERE email=?
56 - ) AS is_super; 56 + // ) AS is_super;
57 - `, timetable, email, email) 57 + // `, timetable, email, email)
58 - if err := row.Scan(&_count, &_isSuper); err == nil { 58 + // if err := row.Scan(&_count, &_isSuper); err == nil {
59 - if _isSuper != 1 { 59 + // if _isSuper != 1 {
60 - functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.") 60 + // functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.")
61 - return 61 + // return
62 - } 62 + // }
63 - if _count <= 0 { 63 + // if _count <= 0 {
64 - functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") 64 + // functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.")
65 - return 65 + // return
66 - } 66 + // }
67 - } else { 67 + // } else {
68 - functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) 68 + // functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
69 - return 69 + // return
70 - } 70 + // }
71 71
72 // Parse Request Data 72 // Parse Request Data
73 type reqDataStruct struct { 73 type reqDataStruct struct {
...@@ -192,7 +192,7 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps ...@@ -192,7 +192,7 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps
192 reservationID := ps.ByName("reservation_id") 192 reservationID := ps.ByName("reservation_id")
193 193
194 // Check Permission 194 // Check Permission
195 - var _count, _isSuper int64 195 + var _count, isSuper int64
196 timetable := fmt.Sprintf("%s,%s", fileID, sheetID) 196 timetable := fmt.Sprintf("%s,%s", fileID, sheetID)
197 row := e.DB.QueryRow(` 197 row := e.DB.QueryRow(`
198 SELECT count(timetable_id) 198 SELECT count(timetable_id)
...@@ -207,27 +207,13 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps ...@@ -207,27 +207,13 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps
207 } 207 }
208 208
209 row = e.DB.QueryRow(` 209 row = e.DB.QueryRow(`
210 - SELECT ( 210 + SELECT is_super FROM users WHERE email=?
211 - SELECT count(a.timetable_id) 211 + `, email)
212 - FROM allowlist AS a, users AS u 212 + if err := row.Scan(&isSuper); err != nil {
213 - WHERE a.user_id=u.id 213 + if err == sql.ErrNoRows {
214 - AND a.timetable_id=? 214 + functions.ResponseError(w, 401, "해당 유저가 존재하지 않음")
215 - AND u.email=?
216 - ) AS count,
217 - (
218 - SELECT is_super FROM users WHERE email=?
219 - ) AS is_super;
220 - `, timetable, email, email)
221 - if err := row.Scan(&_count, &_isSuper); err == nil {
222 - if _isSuper != 1 {
223 - functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.")
224 - return
225 - }
226 - if _count <= 0 {
227 - functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.")
228 return 215 return
229 } 216 }
230 - } else {
231 functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) 217 functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
232 return 218 return
233 } 219 }
...@@ -258,9 +244,11 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps ...@@ -258,9 +244,11 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps
258 functions.ResponseError(w, 500, "예기치 못한 에러 발생 : "+err.Error()) 244 functions.ResponseError(w, 500, "예기치 못한 에러 발생 : "+err.Error())
259 return 245 return
260 } 246 }
261 - if _email != email { 247 + if isSuper == 0 {
262 - functions.ResponseError(w, 403, "예약 접근 권한 부족") 248 + if _email != email {
263 - return 249 + functions.ResponseError(w, 403, "예약 접근 권한 부족")
250 + return
251 + }
264 } 252 }
265 if _transactionType == 0 { 253 if _transactionType == 0 {
266 functions.ResponseError(w, 500, "이미 취소된 예약") 254 functions.ResponseError(w, 500, "이미 취소된 예약")
......
...@@ -3,6 +3,7 @@ package endpoints ...@@ -3,6 +3,7 @@ package endpoints
3 import ( 3 import (
4 "classroom/functions" 4 "classroom/functions"
5 "classroom/models" 5 "classroom/models"
6 + "database/sql"
6 "encoding/json" 7 "encoding/json"
7 "io/ioutil" 8 "io/ioutil"
8 "net/http" 9 "net/http"
...@@ -11,6 +12,68 @@ import ( ...@@ -11,6 +12,68 @@ import (
11 "github.com/julienschmidt/httprouter" 12 "github.com/julienschmidt/httprouter"
12 ) 13 )
13 14
15 +// GET /users
16 +func (e *Endpoints) UsersGet(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
17 + // Get user email
18 + var email string
19 + if _email, ok := r.Header["X-User-Email"]; ok {
20 + email = _email[0]
21 + } else {
22 + functions.ResponseError(w, 401, "X-User-Email 헤더를 보내세요.")
23 + return
24 + }
25 +
26 + // Permission Check
27 + var isSuper int
28 + row := e.DB.QueryRow(`
29 + SELECT is_super FROM users WHERE email=?;
30 + `, email)
31 + if err := row.Scan(&isSuper); err != nil {
32 + if err == sql.ErrNoRows {
33 + functions.ResponseError(w, 401, "해당 유저가 존재하지 않음")
34 + return
35 + }
36 + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
37 + return
38 + }
39 + if isSuper == 0 {
40 + functions.ResponseError(w, 403, "접근 권한 부족. 관리자만 허용된 기능입니다.")
41 + return
42 + }
43 +
44 + // Result Resp
45 + resp := models.UsersGetResponse{}
46 + resp.Users = []models.UsersGetItem{}
47 +
48 + // Querying
49 + rows, err := e.DB.Query(`
50 + SELECT id, email, is_super FROM users;`)
51 + if err != nil {
52 + if err == sql.ErrNoRows {
53 + resp.UsersCount = 0
54 + functions.ResponseOK(w, "success", resp)
55 + return
56 + }
57 + functions.ResponseError(w, 500, err.Error())
58 + return
59 + }
60 + defer rows.Close()
61 +
62 + for rows.Next() {
63 + temp := models.UsersGetItem{}
64 + err := rows.Scan(&temp.UserID, &temp.UserEmail, &temp.IsSuper)
65 + if err != nil {
66 + continue
67 + }
68 + resp.Users = append(resp.Users, temp)
69 + }
70 +
71 + // Struct for response
72 + resp.UsersCount = len(resp.Users)
73 +
74 + functions.ResponseOK(w, "success", resp)
75 +}
76 +
14 // POST /users 77 // POST /users
15 func (e *Endpoints) UsersPost(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { 78 func (e *Endpoints) UsersPost(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
16 // Get user email 79 // Get user email
......
...@@ -61,6 +61,7 @@ func main() { ...@@ -61,6 +61,7 @@ func main() {
61 // Router Setting 61 // Router Setting
62 router := httprouter.New() 62 router := httprouter.New()
63 router.GET("/api", ep.IndexGet) 63 router.GET("/api", ep.IndexGet)
64 + router.GET("/api/users", ep.UsersGet)
64 router.POST("/api/users", ep.UsersPost) 65 router.POST("/api/users", ep.UsersPost)
65 router.GET("/api/timetables/:file_id/:sheet_id/cell", ep.CellGet) 66 router.GET("/api/timetables/:file_id/:sheet_id/cell", ep.CellGet)
66 router.POST("/api/timetables/:file_id/:sheet_id/allow", ep.AllowlistPost) 67 router.POST("/api/timetables/:file_id/:sheet_id/allow", ep.AllowlistPost)
......
1 package models 1 package models
2 2
3 +type UsersGetResponse struct {
4 + UsersCount int `json:"users_count"`
5 + Users []UsersGetItem `json:"users"`
6 +}
7 +
8 +type UsersGetItem struct {
9 + UserID int64 `json:"user_id"`
10 + UserEmail string `json:"user_email"`
11 + IsSuper bool `json:"is_super"`
12 +}
13 +
3 type UsersPostResponse struct { 14 type UsersPostResponse struct {
4 UserID int64 `json:"user_id"` 15 UserID int64 `json:"user_id"`
5 } 16 }
......