add activities.
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
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/models"
|
||||
)
|
||||
|
||||
func (r *activityResolver) UnitName(ctx context.Context, obj *models.Activity) (*string, error) {
|
||||
if !obj.Countable || obj.UnitIsTimeSpent {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return &obj.UnitName, nil
|
||||
}
|
||||
|
||||
func (r *activityResolver) Project(ctx context.Context, obj *models.Activity) (*models.Project, error) {
|
||||
return r.Database.Projects().Find(ctx, obj.ProjectID)
|
||||
}
|
||||
|
||||
// Activity returns graphcore.ActivityResolver implementation.
|
||||
func (r *Resolver) Activity() graphcore.ActivityResolver { return &activityResolver{r} }
|
||||
|
||||
type activityResolver struct{ *Resolver }
|
||||
@@ -5,6 +5,7 @@ package resolvers
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/graph/graphutil"
|
||||
"git.aiterp.net/stufflog/server/graph/loaders"
|
||||
|
||||
@@ -6,6 +6,7 @@ package resolvers
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/internal/xlerrors"
|
||||
"git.aiterp.net/stufflog/server/models"
|
||||
@@ -44,6 +45,83 @@ func (r *mutationResolver) CreateProject(ctx context.Context, input graphcore.Pr
|
||||
return project, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) CreateActivity(ctx context.Context, input graphcore.ActivityCreateInput) (*models.Activity, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
project, err := r.Database.Projects().Find(ctx, input.ProjectID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, *project); err != nil || !perm.CanManageActivities() {
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
activity := &models.Activity{
|
||||
ProjectID: project.ID,
|
||||
Name: input.Name,
|
||||
Countable: input.Countable != nil && *input.Countable,
|
||||
UnitIsTimeSpent: input.UnitIsTimeSpent != nil && *input.UnitIsTimeSpent,
|
||||
BaseValue: input.BaseValue,
|
||||
}
|
||||
if !activity.UnitIsTimeSpent && activity.Countable {
|
||||
if input.UnitName != nil {
|
||||
activity.UnitName = *input.UnitName
|
||||
} else {
|
||||
return nil, errors.New("unit name is required for countable non-time-spent activities")
|
||||
}
|
||||
}
|
||||
if activity.UnitIsTimeSpent || activity.Countable {
|
||||
if input.UnitValue != nil {
|
||||
activity.UnitValue = *input.UnitValue
|
||||
}
|
||||
}
|
||||
|
||||
return r.Database.Activities().Insert(ctx, *activity)
|
||||
}
|
||||
|
||||
func (r *mutationResolver) EditActivity(ctx context.Context, input graphcore.ActivityEditInput) (*models.Activity, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
activity, err := r.Database.Activities().Find(ctx, input.ActivityID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
project, err := r.Database.Projects().Find(ctx, activity.ProjectID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, *project); err != nil || !perm.CanManageActivities() {
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
if input.SetName != nil {
|
||||
activity.Name = *input.SetName
|
||||
}
|
||||
if input.SetBaseValue != nil {
|
||||
activity.BaseValue = *input.SetBaseValue
|
||||
}
|
||||
if input.SetUnitName != nil {
|
||||
activity.UnitName = *input.SetUnitName
|
||||
}
|
||||
if input.SetUnitValue != nil {
|
||||
activity.UnitValue = *input.SetUnitValue
|
||||
}
|
||||
|
||||
err = r.Database.Activities().Save(ctx, *activity)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return activity, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.IssueCreateInput) (*models.Issue, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
@@ -58,14 +136,19 @@ func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.Issu
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
status, err := r.Database.ProjectStatuses().Find(ctx, project.ID, input.StatusName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue := &models.Issue{
|
||||
ProjectID: project.ID,
|
||||
OwnerID: user.ID,
|
||||
AssigneeID: "",
|
||||
StatusStage: input.StatusStage,
|
||||
StatusName: input.StatusName,
|
||||
StatusStage: status.Stage,
|
||||
StatusName: status.Name,
|
||||
Name: input.Name,
|
||||
Title: input.Name,
|
||||
Title: input.Name, // Title set below if it's in the input.
|
||||
Description: input.Description,
|
||||
}
|
||||
if input.Title != nil && *input.Title != "" {
|
||||
|
||||
@@ -48,6 +48,10 @@ func (r *projectResolver) Statuses(ctx context.Context, obj *models.Project, fil
|
||||
return r.Database.ProjectStatuses().List(ctx, *filter)
|
||||
}
|
||||
|
||||
func (r *projectResolver) Activities(ctx context.Context, obj *models.Project) ([]*models.Activity, error) {
|
||||
return r.Database.Activities().List(ctx, models.ActivityFilter{ProjectIDs: []string{obj.ID}})
|
||||
}
|
||||
|
||||
func (r *projectPermissionResolver) User(ctx context.Context, obj *models.ProjectPermission) (*models.User, error) {
|
||||
return loaders.UserLoaderFromContext(ctx).Load(obj.UserID)
|
||||
}
|
||||
|
||||
@@ -8,14 +8,14 @@ import (
|
||||
"errors"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/internal/xlerrors"
|
||||
"git.aiterp.net/stufflog/server/models"
|
||||
"git.aiterp.net/stufflog/server/services"
|
||||
)
|
||||
|
||||
func (r *queryResolver) Issue(ctx context.Context, id string) (*models.Issue, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
return nil, services.ErrPermissionDenied
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, id)
|
||||
@@ -33,7 +33,7 @@ func (r *queryResolver) Issue(ctx context.Context, id string) (*models.Issue, er
|
||||
func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter) ([]*models.Issue, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
return nil, services.ErrPermissionDenied
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
if filter == nil {
|
||||
@@ -61,7 +61,7 @@ func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter)
|
||||
func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
return nil, services.ErrPermissionDenied
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
project, err := r.Database.Projects().Find(ctx, id)
|
||||
@@ -79,7 +79,7 @@ func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project
|
||||
func (r *queryResolver) Projects(ctx context.Context, filter *models.ProjectFilter) ([]*models.Project, error) {
|
||||
user := r.Auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
return nil, services.ErrPermissionDenied
|
||||
return nil, xlerrors.PermissionDenied
|
||||
}
|
||||
|
||||
skipCheck := false
|
||||
|
||||
Reference in New Issue
Block a user