Skip to content

Commit 2f72bfa

Browse files
author
LeeShuang
committed
init project
0 parents  commit 2f72bfa

File tree

19 files changed

+677
-0
lines changed

19 files changed

+677
-0
lines changed

.gitignore

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Binaries for programs and plugins
2+
*.exe
3+
*.exe~
4+
*.dll
5+
*.so
6+
*.dylib
7+
8+
# Test binary, built with `go test -c`
9+
*.test
10+
11+
# Temp output
12+
*.out
13+
*.log
14+
tmp
15+
16+
# Air (hot reload) generated
17+
.air
18+
19+
# Frontend asset
20+
dist
21+
22+
# Dev database
23+
data
24+
25+
# build folder
26+
build
27+
28+
.DS_Store

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# ✍️ Memos
2+
3+
🏗 In heavily development.

api/auth.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package api
2+
3+
import (
4+
"encoding/json"
5+
"memos/common/error"
6+
"memos/store"
7+
"net/http"
8+
9+
"github.com/gorilla/mux"
10+
)
11+
12+
type UserSignUp struct {
13+
Username string `json:"username"`
14+
Password string `json:"password"`
15+
}
16+
17+
func handleUserSignUp(w http.ResponseWriter, r *http.Request) {
18+
var userSignup UserSignUp
19+
err := json.NewDecoder(r.Body).Decode(&userSignup)
20+
21+
if err != nil {
22+
error.ErrorHandler(w, "REQUEST_BODY_ERROR")
23+
return
24+
}
25+
26+
user, err := store.CreateNewUser(userSignup.Username, userSignup.Password, "", "")
27+
28+
if err != nil {
29+
error.ErrorHandler(w, "")
30+
return
31+
}
32+
33+
json.NewEncoder(w).Encode(user)
34+
}
35+
36+
type UserSignin struct {
37+
Username string `json:"username"`
38+
Password string `json:"password"`
39+
}
40+
41+
func handleUserSignIn(w http.ResponseWriter, r *http.Request) {
42+
var userSignin UserSignin
43+
err := json.NewDecoder(r.Body).Decode(&userSignin)
44+
45+
if err != nil {
46+
error.ErrorHandler(w, "")
47+
return
48+
}
49+
50+
user, err := store.GetUserByUsernameAndPassword(userSignin.Username, userSignin.Password)
51+
52+
if err != nil {
53+
error.ErrorHandler(w, "")
54+
return
55+
}
56+
57+
userIdCookie := &http.Cookie{
58+
Name: "user_id",
59+
Value: user.Id,
60+
MaxAge: 3600 * 24 * 30,
61+
}
62+
http.SetCookie(w, userIdCookie)
63+
64+
json.NewEncoder(w).Encode(user)
65+
}
66+
67+
func handleUserSignOut(w http.ResponseWriter, r *http.Request) {
68+
userIdCookie := &http.Cookie{
69+
Name: "user_id",
70+
Value: "",
71+
MaxAge: 0,
72+
}
73+
http.SetCookie(w, userIdCookie)
74+
}
75+
76+
func RegisterAuthRoutes(r *mux.Router) {
77+
authRouter := r.PathPrefix("/api/auth").Subrouter()
78+
79+
authRouter.HandleFunc("/signup", handleUserSignUp).Methods("POST")
80+
authRouter.HandleFunc("/signin", handleUserSignIn).Methods("POST")
81+
authRouter.HandleFunc("/signout", handleUserSignOut).Methods("POST")
82+
}

api/memo.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package api
2+
3+
import (
4+
"encoding/json"
5+
"memos/common/error"
6+
"memos/store"
7+
"net/http"
8+
9+
"github.com/gorilla/mux"
10+
)
11+
12+
func handleGetMyMemos(w http.ResponseWriter, r *http.Request) {
13+
userId, _ := GetUserIdInCookie(r)
14+
15+
memos, err := store.GetMemosByUserId(userId)
16+
17+
if err != nil {
18+
error.ErrorHandler(w, "DATABASE_ERROR")
19+
return
20+
}
21+
22+
json.NewEncoder(w).Encode(memos)
23+
}
24+
25+
type CreateMemo struct {
26+
Content string `json:"content"`
27+
}
28+
29+
func handleCreateMemo(w http.ResponseWriter, r *http.Request) {
30+
userId, _ := GetUserIdInCookie(r)
31+
32+
var createMemo CreateMemo
33+
err := json.NewDecoder(r.Body).Decode(&createMemo)
34+
35+
if err != nil {
36+
error.ErrorHandler(w, "")
37+
return
38+
}
39+
40+
memo, err := store.CreateNewMemo(createMemo.Content, userId)
41+
42+
if err != nil {
43+
error.ErrorHandler(w, "")
44+
return
45+
}
46+
47+
json.NewEncoder(w).Encode(memo)
48+
}
49+
50+
func handleUpdateMemo(w http.ResponseWriter, r *http.Request) {
51+
vars := mux.Vars(r)
52+
memoId := vars["id"]
53+
54+
userId, _ := GetUserIdInCookie(r)
55+
56+
var createMemo CreateMemo
57+
err := json.NewDecoder(r.Body).Decode(&createMemo)
58+
59+
if err != nil {
60+
error.ErrorHandler(w, "")
61+
return
62+
}
63+
64+
memo, err := store.UpdateMemo(memoId, createMemo.Content, userId)
65+
66+
if err != nil {
67+
error.ErrorHandler(w, "")
68+
return
69+
}
70+
71+
json.NewEncoder(w).Encode(memo)
72+
}
73+
74+
func RegisterMemoRoutes(r *mux.Router) {
75+
memoRouter := r.PathPrefix("/api/memo").Subrouter()
76+
77+
memoRouter.Use(AuthCheckerMiddleWare)
78+
79+
memoRouter.HandleFunc("/all", handleGetMyMemos).Methods("GET")
80+
memoRouter.HandleFunc("/", handleCreateMemo).Methods("PUT")
81+
memoRouter.HandleFunc("/{id}", handleUpdateMemo).Methods("PATCH")
82+
}

api/middlewares.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package api
2+
3+
import (
4+
"memos/common/error"
5+
"net/http"
6+
)
7+
8+
func AuthCheckerMiddleWare(next http.Handler) http.Handler {
9+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
10+
userId, err := GetUserIdInCookie(r)
11+
12+
if err != nil || userId == "" {
13+
error.ErrorHandler(w, "NOT_AUTH")
14+
return
15+
}
16+
17+
next.ServeHTTP(w, r)
18+
})
19+
}

api/user.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package api
2+
3+
import (
4+
"encoding/json"
5+
"memos/common/error"
6+
"memos/store"
7+
"net/http"
8+
9+
"github.com/gorilla/mux"
10+
)
11+
12+
func handleGetMyUserInfo(w http.ResponseWriter, r *http.Request) {
13+
userId, _ := GetUserIdInCookie(r)
14+
15+
user, err := store.GetUserById(userId)
16+
17+
if err != nil {
18+
error.ErrorHandler(w, "DATABASE_ERROR")
19+
return
20+
}
21+
22+
json.NewEncoder(w).Encode(user)
23+
}
24+
25+
type UpdateUser struct {
26+
Username string `json:"username"`
27+
Password string `json:"password"`
28+
GithubName string `json:"githubName"`
29+
WxOpenId string `json:"wxOpenId"`
30+
}
31+
32+
func handleUpdateMyUserInfo(w http.ResponseWriter, r *http.Request) {
33+
userId, _ := GetUserIdInCookie(r)
34+
35+
user, err := store.GetUserById(userId)
36+
37+
if err != nil {
38+
error.ErrorHandler(w, "DATABASE_ERROR")
39+
return
40+
}
41+
42+
var updateUser UpdateUser
43+
err = json.NewDecoder(r.Body).Decode(&updateUser)
44+
45+
if err != nil {
46+
error.ErrorHandler(w, "REQUEST_BODY_ERROR")
47+
return
48+
}
49+
50+
json.NewEncoder(w).Encode(user)
51+
}
52+
53+
func RegisterUserRoutes(r *mux.Router) {
54+
userRouter := r.PathPrefix("/api/user").Subrouter()
55+
56+
userRouter.Use(AuthCheckerMiddleWare)
57+
58+
userRouter.HandleFunc("/me", handleGetMyUserInfo).Methods("GET")
59+
userRouter.HandleFunc("/me", handleUpdateMyUserInfo).Methods("PATCH")
60+
}

api/utils.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package api
2+
3+
import (
4+
"net/http"
5+
)
6+
7+
func GetUserIdInCookie(r *http.Request) (string, error) {
8+
userIdCookie, err := r.Cookie("user_id")
9+
10+
return userIdCookie.Value, err
11+
}

common/error/codes.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package error
2+
3+
var Codes = map[string]int{
4+
"NOT_AUTH": 20001,
5+
6+
"REQUEST_BODY_ERROR": 40001,
7+
8+
"DATABASE_ERROR": 50001,
9+
}

common/error/error.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package error
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
)
7+
8+
type ServerError struct {
9+
Code int
10+
Message string
11+
}
12+
13+
type ErrorResponse struct {
14+
StatusCode int `json:"statusCode"`
15+
StatusMessage string `json:"statusMessage"`
16+
Succeed bool `json:"succeed"`
17+
Data interface{} `json:"data"`
18+
}
19+
20+
func getServerError(err string) ServerError {
21+
code, exists := Codes[err]
22+
23+
if !exists {
24+
err = "Bad Request"
25+
code = 40000
26+
}
27+
28+
return ServerError{
29+
Code: code,
30+
Message: err,
31+
}
32+
}
33+
34+
func ErrorHandler(w http.ResponseWriter, err string) {
35+
serverError := getServerError(err)
36+
37+
res := ErrorResponse{
38+
StatusCode: serverError.Code,
39+
StatusMessage: serverError.Message,
40+
Succeed: false,
41+
Data: nil,
42+
}
43+
44+
statusCode := int(serverError.Code / 100)
45+
46+
w.WriteHeader(statusCode)
47+
json.NewEncoder(w).Encode(res)
48+
}

common/utils.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package common
2+
3+
import (
4+
"time"
5+
6+
"github.com/google/uuid"
7+
)
8+
9+
func GenUUID() string {
10+
return uuid.New().String()
11+
}
12+
13+
func GetNowDateTimeStr() string {
14+
return time.Now().Format("RFC3339")
15+
}

0 commit comments

Comments
 (0)