freckie

Add: new endpoint /api/users

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)
......
1 +package models
2 +
3 +type UsersPostResponse struct {
4 + UserID int64 `json:"user_id"`
5 +}