You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.3 KiB
111 lines
3.3 KiB
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"
|
|
"git.aiterp.net/stufflog/server/graph/graphcore"
|
|
"git.aiterp.net/stufflog/server/graph/graphutil"
|
|
"git.aiterp.net/stufflog/server/graph/loaders"
|
|
"git.aiterp.net/stufflog/server/internal/slerrors"
|
|
"git.aiterp.net/stufflog/server/models"
|
|
)
|
|
|
|
func (r *issueResolver) Project(ctx context.Context, obj *models.Issue) (*models.Project, error) {
|
|
return r.Database.Projects().Find(ctx, obj.ProjectID)
|
|
}
|
|
|
|
func (r *issueResolver) Owner(ctx context.Context, obj *models.Issue) (*models.User, error) {
|
|
if obj.OwnerID == "" {
|
|
return nil, nil
|
|
}
|
|
|
|
// Shortcut: if only ID is needed, resolve with empty user.
|
|
if !graphutil.SelectsAnyField(ctx, "name", "active", "admin") {
|
|
return &models.User{ID: obj.OwnerID}, nil
|
|
}
|
|
|
|
return loaders.UserLoaderFromContext(ctx).Load(obj.OwnerID)
|
|
}
|
|
|
|
func (r *issueResolver) Assignee(ctx context.Context, obj *models.Issue) (*models.User, error) {
|
|
if obj.AssigneeID == "" {
|
|
return nil, nil
|
|
}
|
|
|
|
// Shortcut: if only ID is needed, resolve with empty user.
|
|
if !graphutil.SelectsAnyField(ctx, "name", "active", "admin") {
|
|
return &models.User{ID: obj.AssigneeID}, nil
|
|
}
|
|
|
|
return loaders.UserLoaderFromContext(ctx).Load(obj.AssigneeID)
|
|
}
|
|
|
|
func (r *issueResolver) Status(ctx context.Context, obj *models.Issue) (*models.ProjectStatus, error) {
|
|
// Shortcut: if description isn't needed, resolve this with issue's properties.
|
|
if !graphutil.SelectsAnyField(ctx, "description") {
|
|
return &models.ProjectStatus{
|
|
ProjectID: obj.ProjectID,
|
|
Stage: obj.StatusStage,
|
|
Name: obj.StatusName,
|
|
Description: "FAKE",
|
|
}, nil
|
|
}
|
|
|
|
status, err := r.Database.ProjectStatuses().Find(ctx, obj.ProjectID, obj.StatusName)
|
|
if slerrors.IsNotFound(err) {
|
|
return &models.ProjectStatus{
|
|
ProjectID: obj.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 {
|
|
updatedIssue := *obj
|
|
updatedIssue.StatusStage = status.Stage
|
|
_ = r.Database.Issues().Save(ctx, updatedIssue)
|
|
}
|
|
|
|
return status, nil
|
|
}
|
|
|
|
func (r *issueResolver) Tasks(ctx context.Context, obj *models.Issue, filter *models.IssueTaskFilter) ([]*models.IssueTask, error) {
|
|
if filter == nil {
|
|
filter = &models.IssueTaskFilter{}
|
|
}
|
|
filter.IssueTaskIDs = []string{obj.ID}
|
|
|
|
return r.Database.IssueTasks().List(ctx, *filter)
|
|
}
|
|
|
|
func (r *issueResolver) Items(ctx context.Context, obj *models.Issue, filter *models.IssueItemFilter) ([]*models.IssueItem, error) {
|
|
if filter == nil {
|
|
filter = &models.IssueItemFilter{}
|
|
}
|
|
filter.IssueIDs = []string{obj.ID}
|
|
|
|
return r.Database.IssueItems().List(ctx, *filter)
|
|
}
|
|
|
|
func (r *issueResolver) Logs(ctx context.Context, obj *models.Issue) ([]*models.Log, error) {
|
|
loader := loaders.LogsByIssueLoaderFromContext(ctx)
|
|
|
|
logs, err := loader.Load(obj.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
r.Auth.FilterLogList(ctx, &logs)
|
|
|
|
return logs, nil
|
|
}
|
|
|
|
// Issue returns graphcore.IssueResolver implementation.
|
|
func (r *Resolver) Issue() graphcore.IssueResolver { return &issueResolver{r} }
|
|
|
|
type issueResolver struct{ *Resolver }
|