// :WEBAPI: // { // "url": "{schema}://{host}/api/v1/tasks/{taskid}", // "method": "POST", // "arguments": [ // {"name": "taskid", "type": "integer", "description": "task number"} // ], // "description": "Updates existing task" // } func TaskUpdateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { p, ok := ctx.Value("http.request.query.params").(*url.Values) if !ok { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to obtain params from context") return } st, ok := ctx.Value("app.database").(db.Session) if !ok { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to obtain database from context") return } msg, err := ioutil.ReadAll(r.Body) if err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Unable to read body: %s", err) return } logger.GetHTTPEntry(ctx).WithFields(nil).Infof("TaskUpdateHandler: Request body: %s", string(msg)) ev := task.NewTaskEvent() if err = json.Unmarshal(msg, ev); err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Invalid JSON: %s", err) return } taskID := task.MakeID(util.ToInt64(p.Get("task"))) t, err := task.Read(st, taskID) if err != nil { if db.IsNotFound(err) { ahttp.HTTPResponse(w, http.StatusNotFound, "Not found") } else { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to read: %v", err) } return } t.TaskID.Set(util.ToInt64(p.Get("task"))) if !t.TimeCreate.IsDefined() { t.TimeCreate.Set(time.Now().Unix()) } fillTask(t, ev) logger.GetHTTPEntry(ctx).WithFields(nil).Infof("TaskUpdateHandler: Task: %+v", t) if !writeTask(ctx, w, t) { return } ahttp.HTTPResponse(w, http.StatusOK, "OK") }
// :WEBAPI: // { // "url": "{schema}://{host}/api/v1/tasks/{taskid}/subtasks/{subtaskid}", // "method": "POST", // "arguments": [ // {"name": "taskid", "type": "integer", "description": "task number"}, // {"name": "subtaskid", "type": "integer", "description": "subtask number"} // ], // "description": "Updates subtask in task" // } func SubtaskUpdateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { p, ok := ctx.Value("http.request.query.params").(*url.Values) if !ok { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to obtain params from context") return } st, ok := ctx.Value("app.database").(db.Session) if !ok { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to obtain database from context") return } subtaskID := subtask.MakeID(util.ToInt64(p.Get("task")), util.ToInt64(p.Get("subtask"))) t, err := subtask.Read(st, subtaskID) if err != nil { if db.IsNotFound(err) { ahttp.HTTPResponse(w, http.StatusNotFound, "Not found") } else { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to read: %v", err) } return } t.TaskID.Set(util.ToInt64(p.Get("task"))) t.SubTaskID.Set(util.ToInt64(p.Get("subtask"))) t.TaskID.Readonly(true) t.SubTaskID.Readonly(true) t.TimeCreate.Readonly(true) msg, err := ioutil.ReadAll(r.Body) if err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Unable to read body: %s", err) return } logger.GetHTTPEntry(ctx).WithFields(nil).Debugf("SubtaskUpdateHandler: Request body: %s", string(msg)) if err = json.Unmarshal(msg, t); err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Invalid JSON: %s", err) return } logger.GetHTTPEntry(ctx).WithFields(nil).Debugf("SubtaskUpdateHandler: SubTask: %+v", t) if !writeSubTask(ctx, w, t) { return } ahttp.HTTPResponse(w, http.StatusOK, "OK") }
// :WEBAPI: // { // "url": "{schema}://{host}/api/v1/tasks", // "method": "POST", // "description": "Creates new task" // } func TaskCreateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { cfg, ok := ctx.Value("app.config").(*config.Config) if !ok { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to obtain config from context") return } msg, err := ioutil.ReadAll(r.Body) if err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Unable to read body: %s", err) return } logger.GetHTTPEntry(ctx).WithFields(nil).Infof("TaskCreateHandler: Request body: %s", string(msg)) ev := task.NewTaskEvent() if err = json.Unmarshal(msg, ev); err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Invalid JSON: %s", err) return } t := task.New() fillTask(t, ev) t.TimeCreate.Set(time.Now().Unix()) logger.GetHTTPEntry(ctx).WithFields(nil).Infof("TaskCreateHandler: Task: %+v", t) if v, ok := t.Repo.Get(); ok { if !util.InSliceString(v, cfg.Builder.Repos) { ahttp.HTTPResponse(w, http.StatusBadRequest, "Unknown repo") return } } else { ahttp.HTTPResponse(w, http.StatusBadRequest, "repo: mandatory field is not specified") return } if !t.Owner.IsDefined() { ahttp.HTTPResponse(w, http.StatusBadRequest, "owner: mandatory field is not specified") return } if !writeTask(ctx, w, t) { return } ahttp.HTTPResponse(w, http.StatusOK, "OK") }
// :WEBAPI: // { // "url": "{schema}://{host}/api/v1/tasks/{taskid}/subtasks", // "method": "POST", // "arguments": [ // {"name": "taskid", "type": "integer", "description": "task number"} // ], // "description": "Creates new subtask for specified task" // } func SubtaskCreateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { p, ok := ctx.Value("http.request.query.params").(*url.Values) if !ok { ahttp.HTTPResponse(w, http.StatusInternalServerError, "Unable to obtain params from context") return } msg, err := ioutil.ReadAll(r.Body) if err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Unable to read body: %s", err) return } logger.GetHTTPEntry(ctx).WithFields(nil).Debugf("SubtaskCreateHandler: Request body: %s", string(msg)) t := subtask.New() if err = json.Unmarshal(msg, t); err != nil { ahttp.HTTPResponse(w, http.StatusBadRequest, "Invalid JSON: %s", err) return } if !t.Owner.IsDefined() { ahttp.HTTPResponse(w, http.StatusBadRequest, "owner: mandatory field is not specified") return } if !t.Type.IsDefined() { t.Type.Set("unknown") } if !t.Status.IsDefined() { t.Status.Set("active") } t.TaskID.Set(util.ToInt64(p.Get("task"))) t.TimeCreate.Set(time.Now().Unix()) logger.GetHTTPEntry(ctx).WithFields(nil).Debugf("SubtaskCreateHandler: SubTask: %+v", t) if !writeSubTask(ctx, w, t) { return } ahttp.HTTPResponse(w, http.StatusOK, "OK") }
func Handler(fn ahttp.Handler) ahttp.Handler { return func(ctx context.Context, resp http.ResponseWriter, req *http.Request) { ctx = context.WithValue(ctx, "http.request.method", req.Method) ctx = context.WithValue(ctx, "http.request.remoteaddr", req.RemoteAddr) ctx = context.WithValue(ctx, "http.request.length", req.ContentLength) ctx = context.WithValue(ctx, "http.request.time", time.Now().String()) defer func() { e := logger.GetHTTPEntry(ctx) e = e.WithField("http.response.time", time.Now().String()) if w, ok := resp.(*ahttp.ResponseWriter); ok { e = e.WithField("http.response.length", w.ResponseLength) e = e.WithField("http.response.status", w.HTTPStatus) e = e.WithField("http.response.error", w.HTTPError) } e.Info(req.URL) }() fn(ctx, resp, req) } }