Showing
5 changed files
with
116 additions
and
55 deletions
... | @@ -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 ( | ||
211 | - SELECT count(a.timetable_id) | ||
212 | - FROM allowlist AS a, users AS u | ||
213 | - WHERE a.user_id=u.id | ||
214 | - AND a.timetable_id=? | ||
215 | - AND u.email=? | ||
216 | - ) AS count, | ||
217 | - ( | ||
218 | SELECT is_super FROM users WHERE email=? | 210 | SELECT is_super FROM users WHERE email=? |
219 | - ) AS is_super; | 211 | + `, email) |
220 | - `, timetable, email, email) | 212 | + if err := row.Scan(&isSuper); err != nil { |
221 | - if err := row.Scan(&_count, &_isSuper); err == nil { | 213 | + if err == sql.ErrNoRows { |
222 | - if _isSuper != 1 { | 214 | + functions.ResponseError(w, 401, "해당 유저가 존재하지 않음") |
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,10 +244,12 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps | ... | @@ -258,10 +244,12 @@ 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 | } |
247 | + if isSuper == 0 { | ||
261 | if _email != email { | 248 | if _email != email { |
262 | functions.ResponseError(w, 403, "예약 접근 권한 부족") | 249 | functions.ResponseError(w, 403, "예약 접근 권한 부족") |
263 | return | 250 | return |
264 | } | 251 | } |
252 | + } | ||
265 | if _transactionType == 0 { | 253 | if _transactionType == 0 { |
266 | functions.ResponseError(w, 500, "이미 취소된 예약") | 254 | functions.ResponseError(w, 500, "이미 취소된 예약") |
267 | return | 255 | return | ... | ... |
... | @@ -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 | } | ... | ... |
-
Please register or login to post a comment