Showing
3 changed files
with
100 additions
and
1 deletions
api/endpoints/users.go
0 → 100644
1 | +package endpoints | ||
2 | + | ||
3 | +import ( | ||
4 | + "classroom/functions" | ||
5 | + "classroom/models" | ||
6 | + "encoding/json" | ||
7 | + "io/ioutil" | ||
8 | + "net/http" | ||
9 | + "strings" | ||
10 | + | ||
11 | + "github.com/julienschmidt/httprouter" | ||
12 | +) | ||
13 | + | ||
14 | +// POST /users | ||
15 | +func (e *Endpoints) UsersPost(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { | ||
16 | + // Get user email | ||
17 | + var email string | ||
18 | + if _email, ok := r.Header["X-User-Email"]; ok { | ||
19 | + email = _email[0] | ||
20 | + } else { | ||
21 | + functions.ResponseError(w, 401, "X-User-Email 헤더를 보내세요.") | ||
22 | + return | ||
23 | + } | ||
24 | + | ||
25 | + // Check Permission | ||
26 | + var _count int64 | ||
27 | + row := e.DB.QueryRow(` | ||
28 | + SELECT count(id) | ||
29 | + FROM users | ||
30 | + WHERE is_super=1 | ||
31 | + AND email=?; | ||
32 | + `, email) | ||
33 | + if err := row.Scan(&_count); err == nil { | ||
34 | + if _count <= 0 { | ||
35 | + functions.ResponseError(w, 403, "관리자 권한 부족.") | ||
36 | + return | ||
37 | + } | ||
38 | + } else { | ||
39 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
40 | + return | ||
41 | + } | ||
42 | + | ||
43 | + // Parse Request Data | ||
44 | + var isSuper bool | ||
45 | + type reqDataStruct struct { | ||
46 | + Email *string `json:"email"` | ||
47 | + IsSuper *bool `json:"is_super"` | ||
48 | + } | ||
49 | + var reqData reqDataStruct | ||
50 | + if strings.Contains(r.Header.Get("Content-Type"), "application/json") { | ||
51 | + body, err := ioutil.ReadAll(r.Body) | ||
52 | + if err != nil { | ||
53 | + functions.ResponseError(w, 500, err.Error()) | ||
54 | + } | ||
55 | + json.Unmarshal(body, &reqData) | ||
56 | + } else { | ||
57 | + functions.ResponseError(w, 400, "JSON 형식만 가능합니다.") | ||
58 | + return | ||
59 | + } | ||
60 | + if reqData.Email == nil { | ||
61 | + functions.ResponseError(w, 400, "파라미터를 전부 보내주세요.") | ||
62 | + return | ||
63 | + } | ||
64 | + | ||
65 | + if reqData.IsSuper == nil { | ||
66 | + isSuper = false | ||
67 | + } else { | ||
68 | + isSuper = *(reqData.IsSuper) | ||
69 | + } | ||
70 | + | ||
71 | + // Querying | ||
72 | + result, err := e.DB.Exec(` | ||
73 | + INSERT INTO users (email, is_super) | ||
74 | + VALUES (?, ?); | ||
75 | + `, *(reqData.Email), isSuper) | ||
76 | + if err != nil { | ||
77 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
78 | + return | ||
79 | + } | ||
80 | + | ||
81 | + // Result | ||
82 | + resp := models.UsersPostResponse{} | ||
83 | + resp.UserID, err = result.LastInsertId() | ||
84 | + if err != nil { | ||
85 | + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) | ||
86 | + return | ||
87 | + } | ||
88 | + | ||
89 | + functions.ResponseOK(w, "success", resp) | ||
90 | + return | ||
91 | +} |
... | @@ -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.POST("/api/users", ep.UsersPost) | ||
64 | router.GET("/api/timetables/:file_id/:sheet_id/cell", ep.CellGet) | 65 | router.GET("/api/timetables/:file_id/:sheet_id/cell", ep.CellGet) |
65 | router.POST("/api/timetables/:file_id/:sheet_id/reservation", ep.ReservationPost) | 66 | router.POST("/api/timetables/:file_id/:sheet_id/reservation", ep.ReservationPost) |
66 | router.DELETE("/api/timetables/:file_id/:sheet_id/reservation/:reservation_id", ep.ReservationDelete) | 67 | router.DELETE("/api/timetables/:file_id/:sheet_id/reservation/:reservation_id", ep.ReservationDelete) |
... | @@ -69,10 +70,12 @@ func main() { | ... | @@ -69,10 +70,12 @@ func main() { |
69 | portStr := strconv.Itoa(cfg.Server.Port) | 70 | portStr := strconv.Itoa(cfg.Server.Port) |
70 | if cfg.Server.LocalMode { | 71 | if cfg.Server.LocalMode { |
71 | handler := cors.AllowAll().Handler(router) | 72 | handler := cors.AllowAll().Handler(router) |
73 | + hs := make(HostSwitch) | ||
74 | + hs["icns.frec.kr:8080"] = handler | ||
72 | 75 | ||
73 | // Start Server in Local Mode | 76 | // Start Server in Local Mode |
74 | log.Println("[Local Mode] Starting HTTP API Server on port", portStr) | 77 | log.Println("[Local Mode] Starting HTTP API Server on port", portStr) |
75 | - log.Fatal(http.ListenAndServe(":"+portStr, handler)) | 78 | + log.Fatal(http.ListenAndServe(":"+portStr, hs)) |
76 | 79 | ||
77 | } else { // Release Mode | 80 | } else { // Release Mode |
78 | handler := cors.AllowAll().Handler(router) | 81 | handler := cors.AllowAll().Handler(router) | ... | ... |
-
Please register or login to post a comment