Showing
3 changed files
with
138 additions
and
14 deletions
... | @@ -42,22 +42,30 @@ func (e *Endpoints) AllowlistPost(w http.ResponseWriter, r *http.Request, ps htt | ... | @@ -42,22 +42,30 @@ func (e *Endpoints) AllowlistPost(w http.ResponseWriter, r *http.Request, ps htt |
42 | } | 42 | } |
43 | 43 | ||
44 | row = e.DB.QueryRow(` | 44 | row = e.DB.QueryRow(` |
45 | - SELECT count(a.timetable_id), u.is_super | 45 | + SELECT ( |
46 | + SELECT count(a.timetable_id) | ||
46 | FROM allowlist AS a, users AS u | 47 | FROM allowlist AS a, users AS u |
47 | WHERE a.user_id=u.id | 48 | WHERE a.user_id=u.id |
48 | AND a.timetable_id=? | 49 | AND a.timetable_id=? |
49 | - AND u.email=?; | 50 | + AND u.email=? |
50 | - `, timetable, email) | 51 | + ) AS count, |
52 | + ( | ||
53 | + SELECT is_super FROM users WHERE email=? | ||
54 | + ) AS is_super; | ||
55 | + `, timetable, email, email) | ||
51 | if err := row.Scan(&_count, &_isSuper); err == nil { | 56 | if err := row.Scan(&_count, &_isSuper); err == nil { |
57 | + if _isSuper != 1 { | ||
58 | + functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.") | ||
59 | + return | ||
60 | + } | ||
52 | if _count <= 0 { | 61 | if _count <= 0 { |
53 | functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") | 62 | functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") |
54 | return | 63 | return |
55 | } | 64 | } |
56 | - if _isSuper != 1 { | 65 | + } else { |
57 | - functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.") | 66 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) |
58 | return | 67 | return |
59 | } | 68 | } |
60 | - } | ||
61 | 69 | ||
62 | // Parse Request Data | 70 | // Parse Request Data |
63 | type reqDataStruct struct { | 71 | type reqDataStruct struct { |
... | @@ -94,3 +102,94 @@ func (e *Endpoints) AllowlistPost(w http.ResponseWriter, r *http.Request, ps htt | ... | @@ -94,3 +102,94 @@ func (e *Endpoints) AllowlistPost(w http.ResponseWriter, r *http.Request, ps htt |
94 | 102 | ||
95 | functions.ResponseOK(w, "success", nil) | 103 | functions.ResponseOK(w, "success", nil) |
96 | } | 104 | } |
105 | + | ||
106 | +// DELETE /timetables/<file_id>/<sheet_id>/allow | ||
107 | +func (e *Endpoints) AllowlistDelete(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { | ||
108 | + // Get user email | ||
109 | + var email string | ||
110 | + if _email, ok := r.Header["X-User-Email"]; ok { | ||
111 | + email = _email[0] | ||
112 | + } else { | ||
113 | + functions.ResponseError(w, 401, "X-User-Email 헤더를 보내세요.") | ||
114 | + return | ||
115 | + } | ||
116 | + | ||
117 | + // Get Path Parameters | ||
118 | + fileID := ps.ByName("file_id") | ||
119 | + sheetID := ps.ByName("sheet_id") | ||
120 | + | ||
121 | + // Check Permission | ||
122 | + var _count, _isSuper int64 | ||
123 | + timetable := fmt.Sprintf("%s,%s", fileID, sheetID) | ||
124 | + row := e.DB.QueryRow(` | ||
125 | + SELECT count(timetable_id) | ||
126 | + FROM allowlist | ||
127 | + WHERE timetable_id=?; | ||
128 | + `, timetable) | ||
129 | + if err := row.Scan(&_count); err == nil { | ||
130 | + if _count <= 0 { | ||
131 | + functions.ResponseError(w, 404, "존재하지 않는 timetable.") | ||
132 | + return | ||
133 | + } | ||
134 | + } | ||
135 | + | ||
136 | + row = e.DB.QueryRow(` | ||
137 | + SELECT ( | ||
138 | + SELECT count(a.timetable_id) | ||
139 | + FROM allowlist AS a, users AS u | ||
140 | + WHERE a.user_id=u.id | ||
141 | + AND a.timetable_id=? | ||
142 | + AND u.email=? | ||
143 | + ) AS count, | ||
144 | + ( | ||
145 | + SELECT is_super FROM users WHERE email=? | ||
146 | + ) AS is_super; | ||
147 | + `, timetable, email, email) | ||
148 | + if err := row.Scan(&_count, &_isSuper); err == nil { | ||
149 | + if _isSuper != 1 { | ||
150 | + functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.") | ||
151 | + return | ||
152 | + } | ||
153 | + if _count <= 0 { | ||
154 | + functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") | ||
155 | + return | ||
156 | + } | ||
157 | + } else { | ||
158 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
159 | + return | ||
160 | + } | ||
161 | + | ||
162 | + // Parse Request Data | ||
163 | + type reqDataStruct struct { | ||
164 | + Email *string `json:"email"` | ||
165 | + } | ||
166 | + var reqData reqDataStruct | ||
167 | + if strings.Contains(r.Header.Get("Content-Type"), "application/json") { | ||
168 | + body, err := ioutil.ReadAll(r.Body) | ||
169 | + if err != nil { | ||
170 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
171 | + return | ||
172 | + } | ||
173 | + json.Unmarshal(body, &reqData) | ||
174 | + } else { | ||
175 | + functions.ResponseError(w, 400, "JSON 형식만 가능합니다.") | ||
176 | + return | ||
177 | + } | ||
178 | + if reqData.Email == nil { | ||
179 | + functions.ResponseError(w, 400, "파라미터를 전부 보내주세요.") | ||
180 | + return | ||
181 | + } | ||
182 | + | ||
183 | + // Querying | ||
184 | + _, err := e.DB.Exec(` | ||
185 | + DELETE FROM allowlist | ||
186 | + WHERE timetable_id=? | ||
187 | + AND user_id=(SELECT id FROM users WHERE email=?); | ||
188 | + `, timetable, *(reqData.Email)) | ||
189 | + if err != nil { | ||
190 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
191 | + return | ||
192 | + } | ||
193 | + | ||
194 | + functions.ResponseOK(w, "success", nil) | ||
195 | +} | ... | ... |
... | @@ -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 int64 | 32 | + var _count, _isSuper 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) |
... | @@ -44,17 +44,29 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h | ... | @@ -44,17 +44,29 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h |
44 | } | 44 | } |
45 | 45 | ||
46 | row = e.DB.QueryRow(` | 46 | row = e.DB.QueryRow(` |
47 | + SELECT ( | ||
47 | SELECT count(a.timetable_id) | 48 | SELECT count(a.timetable_id) |
48 | FROM allowlist AS a, users AS u | 49 | FROM allowlist AS a, users AS u |
49 | WHERE a.user_id=u.id | 50 | WHERE a.user_id=u.id |
50 | AND a.timetable_id=? | 51 | AND a.timetable_id=? |
51 | - AND u.email=?; | 52 | + AND u.email=? |
52 | - `, timetable, email) | 53 | + ) AS count, |
53 | - if err := row.Scan(&_count); err == nil { | 54 | + ( |
55 | + SELECT is_super FROM users WHERE email=? | ||
56 | + ) AS is_super; | ||
57 | + `, timetable, email, email) | ||
58 | + if err := row.Scan(&_count, &_isSuper); err == nil { | ||
59 | + if _isSuper != 1 { | ||
60 | + functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.") | ||
61 | + return | ||
62 | + } | ||
54 | if _count <= 0 { | 63 | if _count <= 0 { |
55 | functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") | 64 | functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") |
56 | return | 65 | return |
57 | } | 66 | } |
67 | + } else { | ||
68 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
69 | + return | ||
58 | } | 70 | } |
59 | 71 | ||
60 | // Parse Request Data | 72 | // Parse Request Data |
... | @@ -180,7 +192,7 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps | ... | @@ -180,7 +192,7 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps |
180 | reservationID := ps.ByName("reservation_id") | 192 | reservationID := ps.ByName("reservation_id") |
181 | 193 | ||
182 | // Check Permission | 194 | // Check Permission |
183 | - var _count int64 | 195 | + var _count, _isSuper int64 |
184 | timetable := fmt.Sprintf("%s,%s", fileID, sheetID) | 196 | timetable := fmt.Sprintf("%s,%s", fileID, sheetID) |
185 | row := e.DB.QueryRow(` | 197 | row := e.DB.QueryRow(` |
186 | SELECT count(timetable_id) | 198 | SELECT count(timetable_id) |
... | @@ -195,17 +207,29 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps | ... | @@ -195,17 +207,29 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps |
195 | } | 207 | } |
196 | 208 | ||
197 | row = e.DB.QueryRow(` | 209 | row = e.DB.QueryRow(` |
210 | + SELECT ( | ||
198 | SELECT count(a.timetable_id) | 211 | SELECT count(a.timetable_id) |
199 | FROM allowlist AS a, users AS u | 212 | FROM allowlist AS a, users AS u |
200 | WHERE a.user_id=u.id | 213 | WHERE a.user_id=u.id |
201 | AND a.timetable_id=? | 214 | AND a.timetable_id=? |
202 | - AND u.email=?; | 215 | + AND u.email=? |
203 | - `, timetable, email) | 216 | + ) AS count, |
204 | - if err := row.Scan(&_count); err == nil { | 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 | + } | ||
205 | if _count <= 0 { | 226 | if _count <= 0 { |
206 | functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") | 227 | functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.") |
207 | return | 228 | return |
208 | } | 229 | } |
230 | + } else { | ||
231 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
232 | + return | ||
209 | } | 233 | } |
210 | 234 | ||
211 | // Querying with Transaction | 235 | // Querying with Transaction | ... | ... |
... | @@ -64,6 +64,7 @@ func main() { | ... | @@ -64,6 +64,7 @@ func main() { |
64 | router.POST("/api/users", ep.UsersPost) | 64 | router.POST("/api/users", ep.UsersPost) |
65 | router.GET("/api/timetables/:file_id/:sheet_id/cell", ep.CellGet) | 65 | router.GET("/api/timetables/:file_id/:sheet_id/cell", ep.CellGet) |
66 | router.POST("/api/timetables/:file_id/:sheet_id/allow", ep.AllowlistPost) | 66 | router.POST("/api/timetables/:file_id/:sheet_id/allow", ep.AllowlistPost) |
67 | + router.DELETE("/api/timetables/:file_id/:sheet_id/allow", ep.AllowlistDelete) | ||
67 | router.POST("/api/timetables/:file_id/:sheet_id/reservation", ep.ReservationPost) | 68 | router.POST("/api/timetables/:file_id/:sheet_id/reservation", ep.ReservationPost) |
68 | router.DELETE("/api/timetables/:file_id/:sheet_id/reservation/:reservation_id", ep.ReservationDelete) | 69 | router.DELETE("/api/timetables/:file_id/:sheet_id/reservation/:reservation_id", ep.ReservationDelete) |
69 | 70 | ... | ... |
-
Please register or login to post a comment