-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
125 lines (100 loc) · 2.85 KB
/
main.go
File metadata and controls
125 lines (100 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main
import (
"net/http"
"os"
"strconv"
"time"
"github.com/RLungWu/Tiny-REST-API/internal/taskstore"
"github.com/gin-gonic/gin"
)
type taskServer struct {
store *taskstore.TaskStore
}
func NewTaskServer() *taskServer {
store := taskstore.New()
return &taskServer{store: store}
}
func (ts *taskServer) getAllTasksHandler(c *gin.Context) {
allTasks := ts.store.GetAllTasks()
c.JSON(http.StatusOK, allTasks)
}
func (ts *taskServer) deleteAllTasksHandler(c *gin.Context) {
ts.store.DeleteAllTasks()
}
func (ts *taskServer) createTaskHandler(c *gin.Context) {
type RequestTask struct {
Text string `json:"text"`
Tags []string `json:"tags"`
Due time.Time `json:"due"`
}
var rt RequestTask
if err := c.ShouldBindJSON(&rt); err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
id := ts.store.CreateTask(rt.Text, rt.Tags, rt.Due)
c.JSON(http.StatusOK, gin.H{"Id": id})
}
func (ts *taskServer) getTaskHandler(c *gin.Context) {
id, err := strconv.Atoi(c.Params.ByName("id"))
if err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
task, err := ts.store.GetTask(id)
if err != nil {
c.String(http.StatusNotFound, err.Error())
return
}
c.JSON(http.StatusOK, task)
}
func (ts *taskServer) deleteTaskHandler(c *gin.Context) {
id, err := strconv.Atoi(c.Params.ByName("id"))
if err != nil {
c.String(http.StatusBadRequest, err.Error())
}
if err = ts.store.DeleteTask(id); err != nil {
c.String(http.StatusNotFound, err.Error())
}
}
func (ts *taskServer) tagHandler(c *gin.Context) {
tag := c.Params.ByName("tags")
tasks := ts.store.GetTasksByTag(tag)
c.JSON(http.StatusOK, tasks)
}
func (ts *taskServer) dueHandler(c *gin.Context) {
badRequestError := func() {
c.String(http.StatusBadRequest, "expect /due/<year>/<month>/<day>, got %v", c.FullPath())
}
year, err := strconv.Atoi(c.Params.ByName("year"))
if err != nil {
badRequestError()
return
}
month, err := strconv.Atoi(c.Params.ByName("month"))
if err != nil {
badRequestError()
return
}
day, err := strconv.Atoi(c.Params.ByName("day"))
if err != nil {
badRequestError()
return
}
tasks := ts.store.GetTasksByDueDate(year, time.Month(month), day)
c.JSON(http.StatusOK, tasks)
}
func main() {
router := gin.Default()
router.Use(gin.Logger())
router.Use(gin.Recovery())
server := NewTaskServer()
router.POST("/task/", server.createTaskHandler)
router.GET("/task", server.getAllTasksHandler)
router.DELETE("/task/", server.deleteAllTasksHandler)
router.GET("/task/:id", server.getTaskHandler)
router.DELETE("/task/:id", server.deleteTaskHandler)
router.GET("/tag/:tag", server.tagHandler)
router.GET("/due/:year/:montyh/:day", server.dueHandler)
router.Run("localhost:" + os.Getenv("SERVERPORT"))
}