feat: change url structure to use short ids instead of full uuids

This commit is contained in:
Jordan Knott
2021-11-04 13:36:46 -05:00
parent f9a5007104
commit df6140a10f
32 changed files with 613 additions and 289 deletions

View File

@ -359,6 +359,7 @@ type ComplexityRoot struct {
Name func(childComplexity int) int
Permission func(childComplexity int) int
PublicOn func(childComplexity int) int
ShortID func(childComplexity int) int
TaskGroups func(childComplexity int) int
Team func(childComplexity int) int
}
@ -436,6 +437,7 @@ type ComplexityRoot struct {
Labels func(childComplexity int) int
Name func(childComplexity int) int
Position func(childComplexity int) int
ShortID func(childComplexity int) int
TaskGroup func(childComplexity int) int
Watched func(childComplexity int) int
}
@ -680,11 +682,9 @@ type QueryResolver interface {
Users(ctx context.Context) ([]db.UserAccount, error)
InvitedUsers(ctx context.Context) ([]InvitedUserAccount, error)
FindUser(ctx context.Context, input FindUser) (*db.UserAccount, error)
FindProject(ctx context.Context, input FindProject) (*db.Project, error)
FindTask(ctx context.Context, input FindTask) (*db.Task, error)
Projects(ctx context.Context, input *ProjectsFilter) ([]db.Project, error)
FindTeam(ctx context.Context, input FindTeam) (*db.Team, error)
Teams(ctx context.Context) ([]db.Team, error)
FindTeam(ctx context.Context, input FindTeam) (*db.Team, error)
MyTasks(ctx context.Context, input MyTasks) (*MyTasksPayload, error)
LabelColors(ctx context.Context) ([]db.LabelColor, error)
TaskGroups(ctx context.Context) ([]db.TaskGroup, error)
@ -692,6 +692,8 @@ type QueryResolver interface {
Notifications(ctx context.Context) ([]Notified, error)
Notified(ctx context.Context, input NotifiedInput) (*NotifiedResult, error)
HasUnreadNotifications(ctx context.Context) (*HasUnreadNotificationsResult, error)
FindProject(ctx context.Context, input FindProject) (*db.Project, error)
FindTask(ctx context.Context, input FindTask) (*db.Task, error)
SearchMembers(ctx context.Context, input MemberSearchFilter) ([]MemberSearchResult, error)
}
type SubscriptionResolver interface {
@ -699,6 +701,7 @@ type SubscriptionResolver interface {
}
type TaskResolver interface {
ID(ctx context.Context, obj *db.Task) (uuid.UUID, error)
TaskGroup(ctx context.Context, obj *db.Task) (*db.TaskGroup, error)
Description(ctx context.Context, obj *db.Task) (*string, error)
@ -2264,6 +2267,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Project.PublicOn(childComplexity), true
case "Project.shortId":
if e.complexity.Project.ShortID == nil {
break
}
return e.complexity.Project.ShortID(childComplexity), true
case "Project.taskGroups":
if e.complexity.Project.TaskGroups == nil {
break
@ -2654,6 +2664,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Task.Position(childComplexity), true
case "Task.shortId":
if e.complexity.Task.ShortID == nil {
break
}
return e.complexity.Task.ShortID(childComplexity), true
case "Task.taskGroup":
if e.complexity.Task.TaskGroup == nil {
break
@ -3364,6 +3381,7 @@ type Notified {
type Project {
id: ID!
shortId: String!
createdAt: Time!
name: String!
team: Team
@ -3503,6 +3521,15 @@ type UpdateProjectMemberRolePayload {
member: Member!
}
extend type Query {
findProject(input: FindProject!): Project!
}
input FindProject {
projectID: UUID
projectShortID: String
}
extend type Mutation {
createProject(input: NewProject!): Project! @hasRole(roles: [ADMIN], level: TEAM, type: TEAM)
deleteProject(input: DeleteProject!):
@ -3618,12 +3645,9 @@ type Query {
users: [UserAccount!]!
invitedUsers: [InvitedUserAccount!]!
findUser(input: FindUser!): UserAccount!
findProject(input: FindProject!):
Project!
findTask(input: FindTask!): Task!
projects(input: ProjectsFilter): [Project!]!
findTeam(input: FindTeam!): Team!
teams: [Team!]!
findTeam(input: FindTeam!): Team!
myTasks(input: MyTasks!): MyTasksPayload!
labelColors: [LabelColor!]!
taskGroups: [TaskGroup!]!
@ -3691,13 +3715,6 @@ input FindUser {
userID: UUID!
}
input FindProject {
projectID: UUID!
}
input FindTask {
taskID: UUID!
}
input FindTeam {
teamID: UUID!
@ -3727,6 +3744,7 @@ type TaskBadges {
type Task {
id: ID!
shortId: String!
taskGroup: TaskGroup!
createdAt: Time!
name: String!
@ -4042,6 +4060,16 @@ type ToggleTaskLabelPayload {
task: Task!
}
extend type Query {
findTask(input: FindTask!): Task!
}
input FindTask {
taskID: UUID
taskShortID: String
}
extend type Mutation {
createTask(input: NewTask!):
Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK_GROUP)
@ -13300,6 +13328,41 @@ func (ec *executionContext) _Project_id(ctx context.Context, field graphql.Colle
return ec.marshalNID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, field.Selections, res)
}
func (ec *executionContext) _Project_shortId(ctx context.Context, field graphql.CollectedField, obj *db.Project) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Project",
Field: field,
Args: nil,
IsMethod: false,
IsResolver: false,
}
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.ShortID, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(string)
fc.Result = res
return ec.marshalNString2string(ctx, field.Selections, res)
}
func (ec *executionContext) _Project_createdAt(ctx context.Context, field graphql.CollectedField, obj *db.Project) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -14138,90 +14201,6 @@ func (ec *executionContext) _Query_findUser(ctx context.Context, field graphql.C
return ec.marshalNUserAccount2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐUserAccount(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_findProject(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Query",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Query_findProject_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
fc.Args = args
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().FindProject(rctx, args["input"].(FindProject))
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*db.Project)
fc.Result = res
return ec.marshalNProject2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐProject(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_findTask(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Query",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Query_findTask_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
fc.Args = args
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().FindTask(rctx, args["input"].(FindTask))
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*db.Task)
fc.Result = res
return ec.marshalNTask2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐTask(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_projects(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -14264,6 +14243,41 @@ func (ec *executionContext) _Query_projects(ctx context.Context, field graphql.C
return ec.marshalNProject2ᚕgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐProjectᚄ(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_teams(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Query",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().Teams(rctx)
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.([]db.Team)
fc.Result = res
return ec.marshalNTeam2ᚕgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐTeamᚄ(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_findTeam(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -14306,41 +14320,6 @@ func (ec *executionContext) _Query_findTeam(ctx context.Context, field graphql.C
return ec.marshalNTeam2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐTeam(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_teams(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Query",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().Teams(rctx)
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.([]db.Team)
fc.Result = res
return ec.marshalNTeam2ᚕgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐTeamᚄ(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_myTasks(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -14597,6 +14576,90 @@ func (ec *executionContext) _Query_hasUnreadNotifications(ctx context.Context, f
return ec.marshalNHasUnreadNotificationsResult2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋgraphᚐHasUnreadNotificationsResult(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_findProject(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Query",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Query_findProject_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
fc.Args = args
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().FindProject(rctx, args["input"].(FindProject))
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*db.Project)
fc.Result = res
return ec.marshalNProject2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐProject(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_findTask(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Query",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Query_findTask_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
fc.Args = args
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().FindTask(rctx, args["input"].(FindTask))
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*db.Task)
fc.Result = res
return ec.marshalNTask2ᚖgithubᚗcomᚋjordanknottᚋtaskcafeᚋinternalᚋdbᚐTask(ctx, field.Selections, res)
}
func (ec *executionContext) _Query_searchMembers(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -14930,6 +14993,41 @@ func (ec *executionContext) _Task_id(ctx context.Context, field graphql.Collecte
return ec.marshalNID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, field.Selections, res)
}
func (ec *executionContext) _Task_shortId(ctx context.Context, field graphql.CollectedField, obj *db.Task) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Task",
Field: field,
Args: nil,
IsMethod: false,
IsResolver: false,
}
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.ShortID, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(string)
fc.Result = res
return ec.marshalNString2string(ctx, field.Selections, res)
}
func (ec *executionContext) _Task_taskGroup(ctx context.Context, field graphql.CollectedField, obj *db.Task) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -19707,7 +19805,15 @@ func (ec *executionContext) unmarshalInputFindProject(ctx context.Context, obj i
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("projectID"))
it.ProjectID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v)
it.ProjectID, err = ec.unmarshalOUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v)
if err != nil {
return it, err
}
case "projectShortID":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("projectShortID"))
it.ProjectShortID, err = ec.unmarshalOString2ᚖstring(ctx, v)
if err != nil {
return it, err
}
@ -19727,7 +19833,15 @@ func (ec *executionContext) unmarshalInputFindTask(ctx context.Context, obj inte
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("taskID"))
it.TaskID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v)
it.TaskID, err = ec.unmarshalOUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v)
if err != nil {
return it, err
}
case "taskShortID":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("taskShortID"))
it.TaskShortID, err = ec.unmarshalOString2ᚖstring(ctx, v)
if err != nil {
return it, err
}
@ -22875,6 +22989,11 @@ func (ec *executionContext) _Project(ctx context.Context, sel ast.SelectionSet,
}
return res
})
case "shortId":
out.Values[i] = ec._Project_shortId(ctx, field, obj)
if out.Values[i] == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
case "createdAt":
out.Values[i] = ec._Project_createdAt(ctx, field, obj)
if out.Values[i] == graphql.Null {
@ -23226,34 +23345,6 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
}
return res
})
case "findProject":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Query_findProject(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
return res
})
case "findTask":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Query_findTask(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
return res
})
case "projects":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
@ -23268,20 +23359,6 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
}
return res
})
case "findTeam":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Query_findTeam(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
return res
})
case "teams":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
@ -23296,6 +23373,20 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
}
return res
})
case "findTeam":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Query_findTeam(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
return res
})
case "myTasks":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
@ -23391,6 +23482,34 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
}
return res
})
case "findProject":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Query_findProject(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
return res
})
case "findTask":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Query_findTask(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
return res
})
case "searchMembers":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
@ -23529,6 +23648,11 @@ func (ec *executionContext) _Task(ctx context.Context, sel ast.SelectionSet, obj
}
return res
})
case "shortId":
out.Values[i] = ec._Task_shortId(ctx, field, obj)
if out.Values[i] == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
case "taskGroup":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {

View File

@ -215,11 +215,13 @@ type DuplicateTaskGroupPayload struct {
}
type FindProject struct {
ProjectID uuid.UUID `json:"projectID"`
ProjectID *uuid.UUID `json:"projectID"`
ProjectShortID *string `json:"projectShortID"`
}
type FindTask struct {
TaskID uuid.UUID `json:"taskID"`
TaskID *uuid.UUID `json:"taskID"`
TaskShortID *string `json:"taskShortID"`
}
type FindTeam struct {

View File

@ -392,6 +392,39 @@ func (r *projectLabelResolver) Name(ctx context.Context, obj *db.ProjectLabel) (
return name, nil
}
func (r *queryResolver) FindProject(ctx context.Context, input FindProject) (*db.Project, error) {
_, isLoggedIn := GetUser(ctx)
var projectID uuid.UUID
var err error
if input.ProjectID != nil {
projectID = *input.ProjectID
} else if input.ProjectShortID != nil {
projectID, err = r.Repository.GetProjectIDByShortID(ctx, *input.ProjectShortID)
if err != nil {
log.WithError(err).Error("error while getting project id by short id")
return &db.Project{}, err
}
} else {
return &db.Project{}, errors.New("FindProject requires either ProjectID or ProjectShortID to be set")
}
if !isLoggedIn {
isPublic, _ := IsProjectPublic(ctx, r.Repository, projectID)
if !isPublic {
return &db.Project{}, NotAuthorized()
}
}
project, err := r.Repository.GetProjectByID(ctx, projectID)
if err == sql.ErrNoRows {
return &db.Project{}, &gqlerror.Error{
Message: "Project not found",
Extensions: map[string]interface{}{
"code": "NOT_FOUND",
},
}
}
return &project, nil
}
// LabelColor returns LabelColorResolver implementation.
func (r *Resolver) LabelColor() LabelColorResolver { return &labelColorResolver{r} }

View File

@ -61,31 +61,6 @@ func (r *queryResolver) FindUser(ctx context.Context, input FindUser) (*db.UserA
return &account, err
}
func (r *queryResolver) FindProject(ctx context.Context, input FindProject) (*db.Project, error) {
_, isLoggedIn := GetUser(ctx)
if !isLoggedIn {
isPublic, _ := IsProjectPublic(ctx, r.Repository, input.ProjectID)
if !isPublic {
return &db.Project{}, NotAuthorized()
}
}
project, err := r.Repository.GetProjectByID(ctx, input.ProjectID)
if err == sql.ErrNoRows {
return &db.Project{}, &gqlerror.Error{
Message: "Project not found",
Extensions: map[string]interface{}{
"code": "NOT_FOUND",
},
}
}
return &project, nil
}
func (r *queryResolver) FindTask(ctx context.Context, input FindTask) (*db.Task, error) {
task, err := r.Repository.GetTaskByID(ctx, input.TaskID)
return &task, err
}
func (r *queryResolver) Projects(ctx context.Context, input *ProjectsFilter) ([]db.Project, error) {
userID, ok := GetUser(ctx)
if !ok {
@ -137,14 +112,6 @@ func (r *queryResolver) Projects(ctx context.Context, input *ProjectsFilter) ([]
return allProjects, nil
}
func (r *queryResolver) FindTeam(ctx context.Context, input FindTeam) (*db.Team, error) {
team, err := r.Repository.GetTeamByID(ctx, input.TeamID)
if err != nil {
return &db.Team{}, err
}
return &team, nil
}
func (r *queryResolver) Teams(ctx context.Context) ([]db.Team, error) {
userID, ok := GetUser(ctx)
if !ok {
@ -190,6 +157,14 @@ func (r *queryResolver) Teams(ctx context.Context) ([]db.Team, error) {
return foundTeams, nil
}
func (r *queryResolver) FindTeam(ctx context.Context, input FindTeam) (*db.Team, error) {
team, err := r.Repository.GetTeamByID(ctx, input.TeamID)
if err != nil {
return &db.Team{}, err
}
return &team, nil
}
func (r *queryResolver) MyTasks(ctx context.Context, input MyTasks) (*MyTasksPayload, error) {
userID, _ := GetUserID(ctx)
projects := []ProjectTaskMapping{}

View File

@ -6,6 +6,7 @@ type ProjectPermission {
type Project {
id: ID!
shortId: String!
createdAt: Time!
name: String!
team: Team
@ -145,6 +146,15 @@ type UpdateProjectMemberRolePayload {
member: Member!
}
extend type Query {
findProject(input: FindProject!): Project!
}
input FindProject {
projectID: UUID
projectShortID: String
}
extend type Mutation {
createProject(input: NewProject!): Project! @hasRole(roles: [ADMIN], level: TEAM, type: TEAM)
deleteProject(input: DeleteProject!):

View File

@ -6,6 +6,7 @@ type ProjectPermission {
type Project {
id: ID!
shortId: String!
createdAt: Time!
name: String!
team: Team

View File

@ -1,3 +1,12 @@
extend type Query {
findProject(input: FindProject!): Project!
}
input FindProject {
projectID: UUID
projectShortID: String
}
extend type Mutation {
createProject(input: NewProject!): Project! @hasRole(roles: [ADMIN], level: TEAM, type: TEAM)
deleteProject(input: DeleteProject!):

View File

@ -75,12 +75,9 @@ type Query {
users: [UserAccount!]!
invitedUsers: [InvitedUserAccount!]!
findUser(input: FindUser!): UserAccount!
findProject(input: FindProject!):
Project!
findTask(input: FindTask!): Task!
projects(input: ProjectsFilter): [Project!]!
findTeam(input: FindTeam!): Team!
teams: [Team!]!
findTeam(input: FindTeam!): Team!
myTasks(input: MyTasks!): MyTasksPayload!
labelColors: [LabelColor!]!
taskGroups: [TaskGroup!]!
@ -148,13 +145,6 @@ input FindUser {
userID: UUID!
}
input FindProject {
projectID: UUID!
}
input FindTask {
taskID: UUID!
}
input FindTeam {
teamID: UUID!

View File

@ -22,6 +22,7 @@ type TaskBadges {
type Task {
id: ID!
shortId: String!
taskGroup: TaskGroup!
createdAt: Time!
name: String!
@ -337,6 +338,16 @@ type ToggleTaskLabelPayload {
task: Task!
}
extend type Query {
findTask(input: FindTask!): Task!
}
input FindTask {
taskID: UUID
taskShortID: String
}
extend type Mutation {
createTask(input: NewTask!):
Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK_GROUP)

View File

@ -22,6 +22,7 @@ type TaskBadges {
type Task {
id: ID!
shortId: String!
taskGroup: TaskGroup!
createdAt: Time!
name: String!

View File

@ -1,3 +1,13 @@
extend type Query {
findTask(input: FindTask!): Task!
}
input FindTask {
taskID: UUID
taskShortID: String
}
extend type Mutation {
createTask(input: NewTask!):
Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK_GROUP)

View File

@ -635,9 +635,9 @@ func (r *mutationResolver) AssignTask(ctx context.Context, input *AssignTaskInpu
Data: map[string]string{
"CausedByUsername": causedBy.Username,
"CausedByFullName": causedBy.FullName,
"TaskID": assignedTask.TaskID.String(),
"TaskID": project.TaskShortID,
"TaskName": task.Name,
"ProjectID": project.ProjectID.String(),
"ProjectID": project.ProjectShortID,
"ProjectName": project.Name,
},
})
@ -670,6 +670,23 @@ func (r *mutationResolver) UnassignTask(ctx context.Context, input *UnassignTask
return &task, nil
}
func (r *queryResolver) FindTask(ctx context.Context, input FindTask) (*db.Task, error) {
var taskID uuid.UUID
var err error
if input.TaskID != nil {
taskID = *input.TaskID
} else if input.TaskShortID != nil {
taskID, err = r.Repository.GetTaskIDByShortID(ctx, *input.TaskShortID)
if err != nil {
return &db.Task{}, err
}
} else {
return &db.Task{}, errors.New("FindTask requires either TaskID or TaskShortID to be set")
}
task, err := r.Repository.GetTaskByID(ctx, taskID)
return &task, err
}
func (r *taskResolver) ID(ctx context.Context, obj *db.Task) (uuid.UUID, error) {
return obj.TaskID, nil
}