package resolvers // This file will be automatically regenerated based on the schema, any resolver implementations // will be copied through when generating and any unknown code will be moved to the end. import ( "context" "errors" "fmt" "strings" "time" "git.aiterp.net/stufflog/server/graph/graphcore" "git.aiterp.net/stufflog/server/graph/graphutil" "git.aiterp.net/stufflog/server/internal/xlerrors" "git.aiterp.net/stufflog/server/models" ) func (r *issueTaskResolver) EstimatedUnits(ctx context.Context, obj *models.IssueTask) (*int, error) { // TODO: Data loader activity, err := r.Database.Activities().Find(ctx, obj.ActivityID) if err != nil { return nil, err } if !activity.Countable || activity.UnitIsTimeSpent { return nil, nil } return &obj.EstimatedUnits, nil } func (r *issueTaskResolver) Issue(ctx context.Context, obj *models.IssueTask) (*models.Issue, error) { return r.Database.Issues().Find(ctx, obj.IssueID) } func (r *issueTaskResolver) Activity(ctx context.Context, obj *models.IssueTask) (*models.Activity, error) { return r.Database.Activities().Find(ctx, obj.ActivityID) } func (r *issueTaskResolver) Status(ctx context.Context, obj *models.IssueTask) (*models.ProjectStatus, error) { // The project ID is always the prefix before the first dash in the issue ID. split := strings.SplitN(obj.IssueID, "-", 2) if len(split) == 0 { return nil, errors.New("invalid issue ID") } projectID := split[0] // Shortcut: if description isn't needed, resolve this with issue's properties. if !graphutil.SelectsAnyField(ctx, "description") { return &models.ProjectStatus{ ProjectID: projectID, Stage: obj.StatusStage, Name: obj.StatusName, Description: "FAKE", }, nil } // Find it in the database. TODO: DataLoader status, err := r.Database.ProjectStatuses().Find(ctx, projectID, obj.StatusName) if xlerrors.IsNotFound(err) { return &models.ProjectStatus{ ProjectID: projectID, Stage: obj.StatusStage, Name: obj.StatusName, Description: "(Deleted or unknown status)", }, nil } else if err != nil { return nil, err } // If the stage doesn't match, sneakily correct it for next time. if status.Stage != obj.StatusStage { updatedTask := *obj updatedTask.StatusStage = status.Stage _ = r.Database.IssueTasks().Save(ctx, updatedTask) } return status, nil } func (r *issueTaskResolver) RemainingTime(ctx context.Context, obj *models.IssueTask) (time.Duration, error) { panic(fmt.Errorf("not implemented")) } func (r *issueTaskResolver) RemainingUnits(ctx context.Context, obj *models.IssueTask) (*int, error) { panic(fmt.Errorf("not implemented")) } // IssueTask returns graphcore.IssueTaskResolver implementation. func (r *Resolver) IssueTask() graphcore.IssueTaskResolver { return &issueTaskResolver{r} } type issueTaskResolver struct{ *Resolver }