This commit is contained in:
simon987
2019-01-12 19:52:51 -05:00
parent 83276ce8b0
commit a2b5de0e01
10 changed files with 490 additions and 109 deletions

View File

@@ -9,18 +9,18 @@ import (
)
type WebAPI struct {
server *fasthttp.Server
router *fasthttprouter.Router
server *fasthttp.Server
router *fasthttprouter.Router
Database *storage.Database
}
type Info struct {
Name string `json:"name"`
Name string `json:"name"`
Version string `json:"version"`
}
var info = Info {
Name: "task_tracker",
var info = Info{
Name: "task_tracker",
Version: "1.0",
}
@@ -38,7 +38,7 @@ func New() *WebAPI {
api.server = &fasthttp.Server{
Handler: api.router.Handler,
Name: info.Name,
Name: info.Name,
}
api.router.GET("/", LogRequest(Index))
@@ -55,7 +55,8 @@ func New() *WebAPI {
api.router.GET("/project/get/:id", LogRequest(api.ProjectGet))
api.router.POST("/task/create", LogRequest(api.TaskCreate))
api.router.GET("/task/get/", LogRequest(api.TaskGet))
api.router.GET("/task/get/:project", LogRequest(api.TaskGetFromProject))
api.router.GET("/task/get", LogRequest(api.TaskGet))
return api
}
@@ -68,4 +69,4 @@ func (api *WebAPI) Run() {
if err != nil {
logrus.Fatalf("Error in ListenAndServe: %s", err)
}
}
}

View File

@@ -7,20 +7,21 @@ import (
)
type CreateProjectRequest struct {
Name string `json:"name"`
GitUrl string `json:"git_url"`
Version string `json:"version"`
Name string `json:"name"`
GitUrl string `json:"git_url"`
Version string `json:"version"`
Priority int64 `json:"priority"`
}
type CreateProjectResponse struct {
Ok bool `json:"ok"`
Id int64 `json:"id,omitempty"`
Ok bool `json:"ok"`
Id int64 `json:"id,omitempty"`
Message string `json:"message,omitempty"`
}
type GetProjectResponse struct {
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
Project *storage.Project `json:"project,omitempty"`
}
@@ -30,9 +31,10 @@ func (api *WebAPI) ProjectCreate(r *Request) {
if r.GetJson(createReq) {
project := &storage.Project{
Name: createReq.Name,
Version: createReq.Version,
GitUrl: createReq.GitUrl,
Name: createReq.Name,
Version: createReq.Version,
GitUrl: createReq.GitUrl,
Priority: createReq.Priority,
}
if isValidProject(project) {
@@ -40,8 +42,8 @@ func (api *WebAPI) ProjectCreate(r *Request) {
if err != nil {
r.Json(CreateProjectResponse{
Ok: false,
Message:err.Error(),
Ok: false,
Message: err.Error(),
}, 500)
} else {
r.OkJson(CreateProjectResponse{
@@ -55,7 +57,7 @@ func (api *WebAPI) ProjectCreate(r *Request) {
}).Warn("Invalid project")
r.Json(CreateProjectResponse{
Ok: false,
Ok: false,
Message: "Invalid project",
}, 400)
}
@@ -80,13 +82,13 @@ func (api *WebAPI) ProjectGet(r *Request) {
if project != nil {
r.OkJson(GetProjectResponse{
Ok: true,
Project:project,
Ok: true,
Project: project,
})
} else {
r.Json(GetProjectResponse{
Ok: false,
Ok: false,
Message: "Project not found",
}, 404)
}
}
}

View File

@@ -1,19 +1,29 @@
package api
import (
"errors"
"github.com/Sirupsen/logrus"
"github.com/google/uuid"
"src/task_tracker/storage"
"strconv"
)
type CreateTaskRequest struct {
Project int64 `json:"project"`
MaxRetries int64 `json:"max_retries"`
Recipe string `json:"recipe"`
Project int64 `json:"project"`
MaxRetries int64 `json:"max_retries"`
Recipe string `json:"recipe"`
Priority int64 `json:"priority"`
}
type CreateTaskResponse struct {
Ok bool
Message string
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
}
type GetTaskResponse struct {
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
Task *storage.Task `json:"task,omitempty"`
}
func (api *WebAPI) TaskCreate(r *Request) {
@@ -22,17 +32,17 @@ func (api *WebAPI) TaskCreate(r *Request) {
if r.GetJson(&createReq) {
task := &storage.Task{
Project:createReq.Project,
MaxRetries: createReq.MaxRetries,
Recipe:createReq.Recipe,
Recipe: createReq.Recipe,
Priority: createReq.Priority,
}
if isTaskValid(task) {
err := api.Database.SaveTask(task)
err := api.Database.SaveTask(task, createReq.Project)
if err != nil {
r.Json(CreateTaskResponse{
Ok: false,
Ok: false,
Message: err.Error(), //todo: hide sensitive error?
}, 500)
} else {
@@ -45,11 +55,10 @@ func (api *WebAPI) TaskCreate(r *Request) {
"task": task,
}).Warn("Invalid task")
r.Json(CreateTaskResponse{
Ok: false,
Ok: false,
Message: "Invalid task",
}, 400)
}
}
}
@@ -57,9 +66,6 @@ func isTaskValid(task *storage.Task) bool {
if task.MaxRetries < 0 {
return false
}
if task.Project <= 0 {
return false
}
if len(task.Recipe) <= 0 {
return false
}
@@ -67,7 +73,67 @@ func isTaskValid(task *storage.Task) bool {
return true
}
func (api *WebAPI) TaskGetFromProject(r *Request) {
worker, err := api.workerFromQueryArgs(r)
if err != nil {
r.Json(GetTaskResponse{
Ok: false,
Message: err.Error(),
}, 403)
return
}
project, err := strconv.Atoi(r.Ctx.UserValue("project").(string))
handleErr(err, r)
task := api.Database.GetTaskFromProject(worker, int64(project))
r.OkJson(GetTaskResponse{
Ok: true,
Task: task,
})
}
func (api *WebAPI) TaskGet(r *Request) {
worker, err := api.workerFromQueryArgs(r)
if err != nil {
r.Json(GetTaskResponse{
Ok: false,
Message: err.Error(),
}, 403)
return
}
}
task := api.Database.GetTask(worker)
r.OkJson(GetTaskResponse{
Ok: true,
Task: task,
})
}
func (api WebAPI) workerFromQueryArgs(r *Request) (*storage.Worker, error) {
widStr := string(r.Ctx.QueryArgs().Peek("wid"))
wid, err := uuid.Parse(widStr)
if err != nil {
logrus.WithError(err).WithFields(logrus.Fields{
"wid": widStr,
}).Warn("Can't parse wid")
return nil, err
}
worker := api.Database.GetWorker(wid)
if worker == nil {
logrus.WithError(err).WithFields(logrus.Fields{
"wid": widStr,
}).Warn("Can't parse wid")
return nil, errors.New("worker id does not match any valid worker")
}
return worker, nil
}

View File

@@ -11,15 +11,15 @@ type CreateWorkerRequest struct {
}
type CreateWorkerResponse struct {
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
WorkerId string `json:"id,omitempty"`
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
WorkerId uuid.UUID `json:"id,omitempty"`
}
type GetWorkerResponse struct {
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
Worker *storage.Worker `json:"worker,omitempty"`
Ok bool `json:"ok"`
Message string `json:"message,omitempty"`
Worker *storage.Worker `json:"worker,omitempty"`
}
func (api *WebAPI) WorkerCreate(r *Request) {
@@ -35,8 +35,8 @@ func (api *WebAPI) WorkerCreate(r *Request) {
handleErr(err, r)
} else {
r.OkJson(CreateWorkerResponse{
Ok: true,
WorkerId: id.String(),
Ok: true,
WorkerId: id,
})
}
@@ -58,8 +58,8 @@ func (api *WebAPI) WorkerGet(r *Request) {
}).Warn("Invalid UUID")
r.Json(GetWorkerResponse{
Ok: false,
Message:err.Error(),
Ok: false,
Message: err.Error(),
}, 400)
return
}
@@ -68,13 +68,13 @@ func (api *WebAPI) WorkerGet(r *Request) {
if worker != nil {
r.OkJson(GetWorkerResponse{
Ok: true,
Worker:worker,
Ok: true,
Worker: worker,
})
} else {
r.Json(GetWorkerResponse{
Ok: false,
Message:"Worker not found",
Ok: false,
Message: "Worker not found",
}, 404)
}
}
@@ -83,7 +83,7 @@ func (api *WebAPI) workerCreate(request *CreateWorkerRequest, identity *storage.
worker := storage.Worker{
Id: uuid.New(),
Created: time.Now().Unix(),
Created: time.Now().Unix(),
Identity: identity,
}