Simplify codebase per audit of fd0529b

This commit is contained in:
Ian Gulliver
2026-10-23 09:56:40 -07:00
parent fd0529b949
commit 2bc462ada6
10 changed files with 101 additions and 219 deletions
+3 -6
View File
@@ -90,8 +90,7 @@ func (m *Manager) leadTools(l *live) []mcp.Tool {
if err != nil {
return "", err
}
b, err := json.MarshalIndent(items, "", " ")
return string(b), err
return prettyJSON(items)
}),
tool("read_status",
@@ -104,8 +103,7 @@ func (m *Manager) leadTools(l *live) []mcp.Tool {
if err != nil {
return "", err
}
b, err := json.MarshalIndent(status, "", " ")
return string(b), err
return prettyJSON(status)
}),
tool("answer_question",
@@ -331,8 +329,7 @@ func (m *Manager) leadTools(l *live) []mcp.Tool {
if err != nil {
return "", err
}
b, err := json.MarshalIndent(p, "", " ")
return string(b), err
return prettyJSON(p)
}),
tool("start_todo",
+4 -4
View File
@@ -800,8 +800,8 @@ const workflowSchemaDefs = `"$defs": {
}
}`
func formatDefinition(def api.WorkflowDefinition) (string, error) {
b, err := json.MarshalIndent(def, "", " ")
func prettyJSON(v any) (string, error) {
b, err := json.MarshalIndent(v, "", " ")
return string(b), err
}
@@ -852,7 +852,7 @@ func (m *Manager) workflowTools(tool func(name, description, schema string, run
if err != nil {
return "", err
}
text, err := formatDefinition(frozen.Definition)
text, err := prettyJSON(frozen.Definition)
if err != nil {
return "", err
}
@@ -862,7 +862,7 @@ func (m *Manager) workflowTools(tool func(name, description, schema string, run
if err != nil {
return "", err
}
return formatDefinition(def)
return prettyJSON(def)
}),
tool("save_workflow",
+2 -6
View File
@@ -17,7 +17,7 @@ func (s *Server) GetTaskChanges(w http.ResponseWriter, r *http.Request, taskID s
return
}
step := params.Step != nil && *params.Step
step := deref(params.Step)
if params.Snapshot != nil {
if params.Since != nil {
writeError(w, http.StatusBadRequest, errors.New("since and snapshot can't be used together"))
@@ -93,11 +93,7 @@ func (s *Server) GetTaskDiff(w http.ResponseWriter, r *http.Request, taskID stri
return
}
oldPath := ""
if params.OldPath != nil {
oldPath = *params.OldPath
}
patch, err := git.FileDiff(r.Context(), t.WorktreePath, params.Base, params.Tree, params.Path, oldPath)
patch, err := git.FileDiff(r.Context(), t.WorktreePath, params.Base, params.Tree, params.Path, deref(params.OldPath))
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
+1 -4
View File
@@ -42,10 +42,7 @@ func (s *Server) GetProjectDir(w http.ResponseWriter, r *http.Request, projectID
}
func serveDir(w http.ResponseWriter, r *http.Request, root string, p *string) {
rel := ""
if p != nil {
rel = *p
}
rel := deref(p)
name, full := taskPath(root, rel)
f, err := os.Open(full)
+3 -10
View File
@@ -8,13 +8,7 @@ import (
)
func (s *Server) ListInbox(w http.ResponseWriter, r *http.Request, params api.ListInboxParams) {
f := store.InboxFilter{State: api.Open}
if params.ProjectId != nil {
f.ProjectID = *params.ProjectId
}
if params.TaskId != nil {
f.TaskID = *params.TaskId
}
f := store.InboxFilter{State: api.Open, ProjectID: deref(params.ProjectId), TaskID: deref(params.TaskId)}
if params.State != nil {
f.State = *params.State
}
@@ -55,9 +49,8 @@ func (s *Server) AnswerAgain(w http.ResponseWriter, r *http.Request) {
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
+3 -17
View File
@@ -52,26 +52,12 @@ func (s *Server) MessageLead(w http.ResponseWriter, r *http.Request) {
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
sendID := ""
if req.SendId != nil {
sendID = *req.SendId
}
sess, err := s.agents.MessageLead(r.Context(), u, req.Text, model, effort, sendID, r.Header.Get("Byre-Client"), images)
sess, err := s.agents.MessageLead(r.Context(), u, req.Text, deref(req.Model), deref(req.Effort), deref(req.SendId), r.Header.Get("Byre-Client"), images)
if err != nil {
writeAgentError(w, err)
return
+1 -3
View File
@@ -8,9 +8,7 @@ import (
)
func (s *Server) ListReviews(w http.ResponseWriter, r *http.Request, taskID string) {
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
if !s.taskExists(w, r, taskID) {
return
}
+55 -115
View File
@@ -253,10 +253,26 @@ func actor(r *http.Request) string {
return r.Context().Value(ctxKey{}).(string)
}
func (s *Server) GetMe(w http.ResponseWriter, r *http.Request) {
func (s *Server) actingUser(w http.ResponseWriter, r *http.Request) (api.User, bool) {
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
return u, false
}
return u, true
}
func deref[T any](p *T) T {
var zero T
if p == nil {
return zero
}
return *p
}
func (s *Server) GetMe(w http.ResponseWriter, r *http.Request) {
u, ok := s.actingUser(w, r)
if !ok {
return
}
writeJSON(w, http.StatusOK, u)
@@ -366,10 +382,7 @@ func (s *Server) CreateTask(w http.ResponseWriter, r *http.Request, projectID st
return
}
title := ""
if req.Title != nil {
title = strings.TrimSpace(*req.Title)
}
title := strings.TrimSpace(deref(req.Title))
p, err := s.store.GetProject(r.Context(), projectID)
if err != nil {
@@ -389,9 +402,8 @@ func (s *Server) CreateTask(w http.ResponseWriter, r *http.Request, projectID st
if req.Prompt != nil && strings.TrimSpace(*req.Prompt) != "" {
brief = *req.Prompt
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
tasks, err := s.agents.StartWorkflow(r.Context(), p, u, title, p.DefaultBranch, u.Login, *req.Workflow, brief, nil, "")
@@ -418,28 +430,16 @@ func (s *Server) CreateTask(w http.ResponseWriter, r *http.Request, projectID st
return
}
prompt := ""
if req.Prompt != nil {
prompt = *req.Prompt
}
prompt := deref(req.Prompt)
if strings.TrimSpace(prompt) == "" && len(images) == 0 {
writeError(w, http.StatusBadRequest, errors.New("prompt is empty"))
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
t, err := s.agents.StartTask(r.Context(), p, u, title, prompt, model, effort, r.Header.Get("Byre-Client"), images)
t, err := s.agents.StartTask(r.Context(), p, u, title, prompt, deref(req.Model), deref(req.Effort), r.Header.Get("Byre-Client"), images)
if err != nil {
writeAgentError(w, err)
return
@@ -479,22 +479,12 @@ func (s *Server) StartTodoItem(w http.ResponseWriter, r *http.Request, projectID
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
tasks, err := s.agents.StartTodo(r.Context(), p, u, req.Title, model, effort, u.Login, "", req.Discuss != nil && *req.Discuss)
tasks, err := s.agents.StartTodo(r.Context(), p, u, req.Title, deref(req.Model), deref(req.Effort), u.Login, "", deref(req.Discuss))
if err != nil {
writeAgentError(w, err)
return
@@ -522,12 +512,12 @@ func (s *Server) MergeTask(w http.ResponseWriter, r *http.Request, taskID string
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
var err error
if req.Target != nil && !req.Target.Valid() {
writeError(w, http.StatusBadRequest, fmt.Errorf("unknown target %q", *req.Target))
return
@@ -626,9 +616,8 @@ func (s *Server) MergeIn(w http.ResponseWriter, r *http.Request, taskID string)
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
@@ -672,6 +661,15 @@ func (s *Server) PostToBoard(w http.ResponseWriter, r *http.Request, taskID stri
w.WriteHeader(http.StatusNoContent)
}
func (s *Server) taskExists(w http.ResponseWriter, r *http.Request, taskID string) bool {
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
return false
}
return true
}
func (s *Server) activeTask(w http.ResponseWriter, r *http.Request, taskID string) (api.Task, bool) {
t, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
@@ -778,9 +776,7 @@ func (s *Server) status(ctx context.Context) (api.Status, error) {
}
func (s *Server) ListTaskEvents(w http.ResponseWriter, r *http.Request, taskID string, params api.ListTaskEventsParams) {
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
if !s.taskExists(w, r, taskID) {
return
}
@@ -802,9 +798,7 @@ func (s *Server) ListTaskEvents(w http.ResponseWriter, r *http.Request, taskID s
}
func (s *Server) ListSnapshots(w http.ResponseWriter, r *http.Request, taskID string) {
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
if !s.taskExists(w, r, taskID) {
return
}
@@ -817,9 +811,7 @@ func (s *Server) ListSnapshots(w http.ResponseWriter, r *http.Request, taskID st
}
func (s *Server) ListPreviews(w http.ResponseWriter, r *http.Request, taskID string) {
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
if !s.taskExists(w, r, taskID) {
return
}
@@ -837,9 +829,8 @@ func (s *Server) ForkSnapshot(w http.ResponseWriter, r *http.Request, taskID str
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
@@ -867,19 +858,6 @@ func (s *Server) ContinueSession(w http.ResponseWriter, r *http.Request, session
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
sendID := ""
if req.SendId != nil {
sendID = *req.SendId
}
src, err := s.store.GetSession(r.Context(), sessionID)
if err != nil {
writeStoreError(w, err)
@@ -895,13 +873,12 @@ func (s *Server) ContinueSession(w http.ResponseWriter, r *http.Request, session
writeStoreError(w, err)
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
task, err := s.agents.Continue(r.Context(), src, t, p, u, req.Text, model, effort, sendID, r.Header.Get("Byre-Client"), images...)
task, err := s.agents.Continue(r.Context(), src, t, p, u, req.Text, deref(req.Model), deref(req.Effort), deref(req.SendId), r.Header.Get("Byre-Client"), images...)
if err != nil {
writeAgentError(w, err)
return
@@ -910,9 +887,7 @@ func (s *Server) ContinueSession(w http.ResponseWriter, r *http.Request, session
}
func (s *Server) ListSessions(w http.ResponseWriter, r *http.Request, taskID string) {
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
if !s.taskExists(w, r, taskID) {
return
}
@@ -946,26 +921,12 @@ func (s *Server) CreateSession(w http.ResponseWriter, r *http.Request, taskID st
return
}
u, err := s.store.GetUser(r.Context(), actor(r))
if err != nil {
writeStoreError(w, err)
u, ok := s.actingUser(w, r)
if !ok {
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
sendID := ""
if req.SendId != nil {
sendID = *req.SendId
}
sess, err := s.agents.Create(r.Context(), t, u, req.Prompt, model, effort, sendID, r.Header.Get("Byre-Client"), images...)
sess, err := s.agents.Create(r.Context(), t, u, req.Prompt, deref(req.Model), deref(req.Effort), deref(req.SendId), r.Header.Get("Byre-Client"), images...)
if err != nil {
writeAgentError(w, err)
return
@@ -998,20 +959,7 @@ func (s *Server) SendMessage(w http.ResponseWriter, r *http.Request, sessionID s
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
sendID := ""
if req.SendId != nil {
sendID = *req.SendId
}
sess, _, err := s.agents.Message(r.Context(), sessionID, actor(r), req.Text, model, effort, sendID, r.Header.Get("Byre-Client"), images...)
sess, _, err := s.agents.Message(r.Context(), sessionID, actor(r), req.Text, deref(req.Model), deref(req.Effort), deref(req.SendId), r.Header.Get("Byre-Client"), images...)
if err != nil {
writeAgentError(w, err)
return
@@ -1033,15 +981,7 @@ func (s *Server) CompactSession(w http.ResponseWriter, r *http.Request, sessionI
if !readJSON(w, r, &req) {
return
}
model := ""
if req.Model != nil {
model = *req.Model
}
effort := ""
if req.Effort != nil {
effort = *req.Effort
}
sess, err := s.agents.Compact(r.Context(), sessionID, model, effort)
sess, err := s.agents.Compact(r.Context(), sessionID, deref(req.Model), deref(req.Effort))
if err != nil {
writeAgentError(w, err)
return
+3 -6
View File
@@ -20,13 +20,10 @@ func (s *Server) StreamEvents(w http.ResponseWriter, r *http.Request, params api
last = *params.LastEventID
}
viewer := actor(r)
lead := params.Lead != nil && *params.Lead
taskID := ""
lead := deref(params.Lead)
taskID := deref(params.TaskId)
if params.TaskId != nil {
taskID = *params.TaskId
_, err := s.store.GetTask(r.Context(), taskID)
if err != nil {
writeStoreError(w, err)
if !s.taskExists(w, r, taskID) {
return
}
}
+26 -48
View File
@@ -215,6 +215,15 @@ func (s *Store) Path() string {
return s.path
}
func updatedProject(ctx context.Context, tx *sql.Tx, query string, args ...any) (string, error) {
projectID := ""
err := tx.QueryRowContext(ctx, query, args...).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return "", ErrNotFound
}
return projectID, err
}
func (s *Store) EnsureUser(ctx context.Context, login, displayName string) (api.User, error) {
_, err := s.db.ExecContext(ctx, `
INSERT INTO users (login, display_name, created_at) VALUES (?, ?, ?)
@@ -421,12 +430,8 @@ func (s *Store) GetTask(ctx context.Context, id string) (api.Task, error) {
func (s *Store) SetMergeTitle(ctx context.Context, id, title, actor string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET merge_title = ? WHERE id = ? AND status = ? AND merging_by = '' AND finalizing = '' AND merge_queued_by = '' RETURNING project_id`,
title, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET merge_title = ? WHERE id = ? AND status = ? AND merging_by = '' AND finalizing = '' AND merge_queued_by = '' RETURNING project_id`,
title, id, string(api.TaskStatusActive))
if err != nil {
return err
}
@@ -436,12 +441,8 @@ func (s *Store) SetMergeTitle(ctx context.Context, id, title, actor string) erro
func (s *Store) SetTitles(ctx context.Context, id, title, mergeTitle, actor string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET title = ?, merge_title = ? WHERE id = ? AND status = ? AND merging_by = '' AND finalizing = '' AND merge_queued_by = '' RETURNING project_id`,
title, mergeTitle, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET title = ?, merge_title = ? WHERE id = ? AND status = ? AND merging_by = '' AND finalizing = '' AND merge_queued_by = '' RETURNING project_id`,
title, mergeTitle, id, string(api.TaskStatusActive))
if err != nil {
return err
}
@@ -487,9 +488,8 @@ func (s *Store) TakeMergingBy(ctx context.Context, id string) (string, error) {
func (s *Store) ClearFinalizing(ctx context.Context, id string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET finalizing = '', finalizing_commit = '', finalizing_notes = '', finalizing_unchanged = 0 WHERE id = ? AND finalizing != '' RETURNING project_id`, id).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET finalizing = '', finalizing_commit = '', finalizing_notes = '', finalizing_unchanged = 0 WHERE id = ? AND finalizing != '' RETURNING project_id`, id)
if errors.Is(err, ErrNotFound) {
return nil
}
if err != nil {
@@ -509,12 +509,8 @@ func (s *Store) SetFinalizingUnchanged(ctx context.Context, id string) error {
func (s *Store) setFinalizing(ctx context.Context, id, commit, notes, pushed string, unchanged bool) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET finalizing_commit = ?, finalizing_notes = ?, finalizing_unchanged = ? WHERE id = ? AND status = ? AND finalizing != '' RETURNING project_id`,
commit, notes, unchanged, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET finalizing_commit = ?, finalizing_notes = ?, finalizing_unchanged = ? WHERE id = ? AND status = ? AND finalizing != '' RETURNING project_id`,
commit, notes, unchanged, id, string(api.TaskStatusActive))
if err != nil || commit == "" {
return err
}
@@ -592,9 +588,8 @@ func (s *Store) SetParentMerge(ctx context.Context, id, login string) error {
func (s *Store) ClearParentMerge(ctx context.Context, id string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET parent_merge_by = '' WHERE id = ? AND parent_merge_by != '' RETURNING project_id`, id).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET parent_merge_by = '' WHERE id = ? AND parent_merge_by != '' RETURNING project_id`, id)
if errors.Is(err, ErrNotFound) {
return nil
}
if err != nil {
@@ -688,11 +683,7 @@ func (s *Store) SetMergeAfterReview(ctx context.Context, id string, mar MergeAft
func (s *Store) CancelMergeAfterReview(ctx context.Context, id, actor string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET merge_after_review_by = '', merge_after_review_id = '', merge_after_review_target = '' WHERE id = ? AND merge_after_review_by != '' RETURNING project_id`, id).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET merge_after_review_by = '', merge_after_review_id = '', merge_after_review_target = '' WHERE id = ? AND merge_after_review_by != '' RETURNING project_id`, id)
if err != nil {
return err
}
@@ -728,12 +719,8 @@ func (s *Store) TakeMergeAfterReview(ctx context.Context, id string, reviewIDs [
func (s *Store) SetTaskSummary(ctx context.Context, id, summary, actor string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET summary = ? WHERE id = ? AND status = ? RETURNING project_id`,
summary, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET summary = ? WHERE id = ? AND status = ? RETURNING project_id`,
summary, id, string(api.TaskStatusActive))
if err != nil {
return err
}
@@ -751,11 +738,7 @@ func (s *Store) SuggestDiscard(ctx context.Context, id, reason, actor string) er
func (s *Store) ClearReady(ctx context.Context, id, actor, reason string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET ready = '' WHERE id = ? AND status = ? AND ready != '' RETURNING project_id`, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET ready = '' WHERE id = ? AND status = ? AND ready != '' RETURNING project_id`, id, string(api.TaskStatusActive))
if err != nil {
return err
}
@@ -770,9 +753,8 @@ func (s *Store) ClearReady(ctx context.Context, id, actor, reason string) error
func (s *Store) TakeReady(ctx context.Context, id, ready string) (bool, error) {
taken := false
err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET ready = '' WHERE id = ? AND status = ? AND ready = ? RETURNING project_id`, id, string(api.TaskStatusActive), ready).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET ready = '' WHERE id = ? AND status = ? AND ready = ? RETURNING project_id`, id, string(api.TaskStatusActive), ready)
if errors.Is(err, ErrNotFound) {
return nil
}
if err != nil {
@@ -790,11 +772,7 @@ func (s *Store) TakeReady(ctx context.Context, id, ready string) (bool, error) {
func (s *Store) setReady(ctx context.Context, id, actor, ready, kind string, payload map[string]any) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET ready = ? WHERE id = ? AND status = ? RETURNING project_id`, ready, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
projectID, err := updatedProject(ctx, tx, `UPDATE tasks SET ready = ? WHERE id = ? AND status = ? RETURNING project_id`, ready, id, string(api.TaskStatusActive))
if err != nil {
return err
}