Skip to content

Commit a08ad0e

Browse files
committed
update restful api
1 parent bdaeb3a commit a08ad0e

17 files changed

Lines changed: 519 additions & 93 deletions

File tree

api/auth.go

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package api
22

33
import (
44
"encoding/json"
5-
"memos/common/error"
5+
"memos/api/e"
66
"memos/store"
77
"net/http"
88

@@ -15,22 +15,34 @@ type UserSignUp struct {
1515
}
1616

1717
func handleUserSignUp(w http.ResponseWriter, r *http.Request) {
18-
var userSignup UserSignUp
18+
userSignup := UserSignUp{}
1919
err := json.NewDecoder(r.Body).Decode(&userSignup)
2020

2121
if err != nil {
22-
error.ErrorHandler(w, "REQUEST_BODY_ERROR")
22+
e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Bad request")
2323
return
2424
}
2525

2626
user, err := store.CreateNewUser(userSignup.Username, userSignup.Password, "", "")
2727

2828
if err != nil {
29-
error.ErrorHandler(w, "")
29+
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
3030
return
3131
}
3232

33-
json.NewEncoder(w).Encode(user)
33+
userIdCookie := &http.Cookie{
34+
Name: "user_id",
35+
Value: user.Id,
36+
Path: "/",
37+
MaxAge: 3600 * 24 * 30,
38+
}
39+
http.SetCookie(w, userIdCookie)
40+
41+
json.NewEncoder(w).Encode(Response{
42+
Succeed: true,
43+
Message: "",
44+
Data: user,
45+
})
3446
}
3547

3648
type UserSignin struct {
@@ -39,38 +51,50 @@ type UserSignin struct {
3951
}
4052

4153
func handleUserSignIn(w http.ResponseWriter, r *http.Request) {
42-
var userSignin UserSignin
54+
userSignin := UserSignin{}
4355
err := json.NewDecoder(r.Body).Decode(&userSignin)
4456

4557
if err != nil {
46-
error.ErrorHandler(w, "")
58+
e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Bad request")
4759
return
4860
}
4961

5062
user, err := store.GetUserByUsernameAndPassword(userSignin.Username, userSignin.Password)
5163

5264
if err != nil {
53-
error.ErrorHandler(w, "")
65+
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
5466
return
5567
}
5668

5769
userIdCookie := &http.Cookie{
5870
Name: "user_id",
5971
Value: user.Id,
72+
Path: "/",
6073
MaxAge: 3600 * 24 * 30,
6174
}
6275
http.SetCookie(w, userIdCookie)
6376

64-
json.NewEncoder(w).Encode(user)
77+
json.NewEncoder(w).Encode(Response{
78+
Succeed: true,
79+
Message: "",
80+
Data: user,
81+
})
6582
}
6683

6784
func handleUserSignOut(w http.ResponseWriter, r *http.Request) {
6885
userIdCookie := &http.Cookie{
6986
Name: "user_id",
7087
Value: "",
88+
Path: "/",
7189
MaxAge: 0,
7290
}
7391
http.SetCookie(w, userIdCookie)
92+
93+
json.NewEncoder(w).Encode(Response{
94+
Succeed: true,
95+
Message: "",
96+
Data: nil,
97+
})
7498
}
7599

76100
func RegisterAuthRoutes(r *mux.Router) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package error
1+
package e
22

33
var Codes = map[string]int{
44
"NOT_AUTH": 20001,
Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package error
1+
package e
22

33
import (
44
"encoding/json"
@@ -11,17 +11,19 @@ type ServerError struct {
1111
}
1212

1313
type ErrorResponse struct {
14-
StatusCode int `json:"statusCode"`
15-
StatusMessage string `json:"statusMessage"`
16-
Succeed bool `json:"succeed"`
17-
Data interface{} `json:"data"`
14+
Succeed bool `json:"succeed"`
15+
Message string `json:"message"`
16+
StatusCode int `json:"statusCode"`
17+
Data interface{} `json:"data"`
1818
}
1919

2020
func getServerError(err string) ServerError {
2121
code, exists := Codes[err]
2222

23+
println(err)
24+
2325
if !exists {
24-
err = "Bad Request"
26+
err = "BAD_REQUEST"
2527
code = 40000
2628
}
2729

@@ -31,14 +33,14 @@ func getServerError(err string) ServerError {
3133
}
3234
}
3335

34-
func ErrorHandler(w http.ResponseWriter, err string) {
36+
func ErrorHandler(w http.ResponseWriter, err string, message string) {
3537
serverError := getServerError(err)
3638

3739
res := ErrorResponse{
38-
StatusCode: serverError.Code,
39-
StatusMessage: serverError.Message,
40-
Succeed: false,
41-
Data: nil,
40+
Succeed: false,
41+
Message: message,
42+
StatusCode: serverError.Code,
43+
Data: nil,
4244
}
4345

4446
statusCode := int(serverError.Code / 100)

api/memo.go

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package api
22

33
import (
44
"encoding/json"
5-
"memos/common/error"
5+
"memos/api/e"
66
"memos/store"
77
"net/http"
88

@@ -11,15 +11,22 @@ import (
1111

1212
func handleGetMyMemos(w http.ResponseWriter, r *http.Request) {
1313
userId, _ := GetUserIdInCookie(r)
14+
urlParams := r.URL.Query()
15+
deleted := urlParams.Get("deleted")
16+
onlyDeletedFlag := deleted == "true"
1417

15-
memos, err := store.GetMemosByUserId(userId)
18+
memos, err := store.GetMemosByUserId(userId, onlyDeletedFlag)
1619

1720
if err != nil {
18-
error.ErrorHandler(w, "DATABASE_ERROR")
21+
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
1922
return
2023
}
2124

22-
json.NewEncoder(w).Encode(memos)
25+
json.NewEncoder(w).Encode(Response{
26+
Succeed: true,
27+
Message: "",
28+
Data: memos,
29+
})
2330
}
2431

2532
type CreateMemo struct {
@@ -29,54 +36,77 @@ type CreateMemo struct {
2936
func handleCreateMemo(w http.ResponseWriter, r *http.Request) {
3037
userId, _ := GetUserIdInCookie(r)
3138

32-
var createMemo CreateMemo
39+
createMemo := CreateMemo{}
3340
err := json.NewDecoder(r.Body).Decode(&createMemo)
3441

3542
if err != nil {
36-
error.ErrorHandler(w, "")
43+
e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Bad request")
3744
return
3845
}
3946

4047
memo, err := store.CreateNewMemo(createMemo.Content, userId)
4148

4249
if err != nil {
43-
error.ErrorHandler(w, "")
50+
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
4451
return
4552
}
4653

47-
json.NewEncoder(w).Encode(memo)
54+
json.NewEncoder(w).Encode(Response{
55+
Succeed: true,
56+
Message: "",
57+
Data: memo,
58+
})
4859
}
4960

5061
func handleUpdateMemo(w http.ResponseWriter, r *http.Request) {
5162
vars := mux.Vars(r)
5263
memoId := vars["id"]
5364

54-
userId, _ := GetUserIdInCookie(r)
65+
memoPatch := store.MemoPatch{}
66+
err := json.NewDecoder(r.Body).Decode(&memoPatch)
5567

56-
var createMemo CreateMemo
57-
err := json.NewDecoder(r.Body).Decode(&createMemo)
68+
if err != nil {
69+
e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Bad request")
70+
return
71+
}
72+
73+
memo, err := store.UpdateMemo(memoId, &memoPatch)
5874

5975
if err != nil {
60-
error.ErrorHandler(w, "")
76+
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
6177
return
6278
}
6379

64-
memo, err := store.UpdateMemo(memoId, createMemo.Content, userId)
80+
json.NewEncoder(w).Encode(Response{
81+
Succeed: true,
82+
Message: "",
83+
Data: memo,
84+
})
85+
}
86+
87+
func handleDeleteMemo(w http.ResponseWriter, r *http.Request) {
88+
vars := mux.Vars(r)
89+
memoId := vars["id"]
90+
91+
_, err := store.DeleteMemo(memoId)
6592

6693
if err != nil {
67-
error.ErrorHandler(w, "")
94+
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
6895
return
6996
}
7097

71-
json.NewEncoder(w).Encode(memo)
98+
json.NewEncoder(w).Encode(Response{
99+
Succeed: true,
100+
Message: "",
101+
Data: nil,
102+
})
72103
}
73104

74105
func RegisterMemoRoutes(r *mux.Router) {
75106
memoRouter := r.PathPrefix("/api/memo").Subrouter()
76107

77-
memoRouter.Use(AuthCheckerMiddleWare)
78-
79108
memoRouter.HandleFunc("/all", handleGetMyMemos).Methods("GET")
80109
memoRouter.HandleFunc("/", handleCreateMemo).Methods("PUT")
81110
memoRouter.HandleFunc("/{id}", handleUpdateMemo).Methods("PATCH")
111+
memoRouter.HandleFunc("/{id}", handleDeleteMemo).Methods("DELETE")
82112
}

api/middlewares.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package api
22

33
import (
4-
"memos/common/error"
4+
"memos/api/e"
55
"net/http"
66
)
77

@@ -10,10 +10,19 @@ func AuthCheckerMiddleWare(next http.Handler) http.Handler {
1010
userId, err := GetUserIdInCookie(r)
1111

1212
if err != nil || userId == "" {
13-
error.ErrorHandler(w, "NOT_AUTH")
13+
e.ErrorHandler(w, "NOT_AUTH", "Need authorize")
1414
return
1515
}
1616

1717
next.ServeHTTP(w, r)
1818
})
1919
}
20+
21+
func CorsMiddleWare(next http.Handler) http.Handler {
22+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
23+
w.Header().Set("Access-Control-Allow-Origin", "*")
24+
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
25+
26+
next.ServeHTTP(w, r)
27+
})
28+
}

0 commit comments

Comments
 (0)