e64f6f8569
enforces user admin role requirement for - creating / deleting / setting role for organization users - creating / deleting / setting role for project users - updating project name - deleting project hides action elements based on role for - admin console - team settings if team is only visible through project membership - add project tile if not team admin - project name text editor if not team / project admin - add redirect from team page if settings only visible through project membership - add redirect from admin console if not org admin role enforcement is handled on the api side through a custom GraphQL directive `hasRole`. on the client side, role information is fetched in the TopNavbar's `me` query and stored in the `UserContext`. there is a custom hook, `useCurrentUser`, that provides a user object with two functions, `isVisibile` & `isAdmin` which is used to check roles in order to render/hide relevant UI elements.
603 lines
13 KiB
Go
603 lines
13 KiB
Go
// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.
|
|
|
|
package graph
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/jordanknott/taskcafe/internal/db"
|
|
)
|
|
|
|
type AddTaskLabelInput struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
ProjectLabelID uuid.UUID `json:"projectLabelID"`
|
|
}
|
|
|
|
type AssignTaskInput struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
}
|
|
|
|
type ChecklistBadge struct {
|
|
Complete int `json:"complete"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
type CreateProjectMember struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
}
|
|
|
|
type CreateProjectMemberPayload struct {
|
|
Ok bool `json:"ok"`
|
|
Member *Member `json:"member"`
|
|
}
|
|
|
|
type CreateTaskChecklist struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
Name string `json:"name"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type CreateTaskChecklistItem struct {
|
|
TaskChecklistID uuid.UUID `json:"taskChecklistID"`
|
|
Name string `json:"name"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type CreateTeamMember struct {
|
|
UserID uuid.UUID `json:"userID"`
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
}
|
|
|
|
type CreateTeamMemberPayload struct {
|
|
Team *db.Team `json:"team"`
|
|
TeamMember *Member `json:"teamMember"`
|
|
}
|
|
|
|
type DeleteProject struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
}
|
|
|
|
type DeleteProjectLabel struct {
|
|
ProjectLabelID uuid.UUID `json:"projectLabelID"`
|
|
}
|
|
|
|
type DeleteProjectMember struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
}
|
|
|
|
type DeleteProjectMemberPayload struct {
|
|
Ok bool `json:"ok"`
|
|
Member *Member `json:"member"`
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
}
|
|
|
|
type DeleteProjectPayload struct {
|
|
Ok bool `json:"ok"`
|
|
Project *db.Project `json:"project"`
|
|
}
|
|
|
|
type DeleteTaskChecklist struct {
|
|
TaskChecklistID uuid.UUID `json:"taskChecklistID"`
|
|
}
|
|
|
|
type DeleteTaskChecklistItem struct {
|
|
TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"`
|
|
}
|
|
|
|
type DeleteTaskChecklistItemPayload struct {
|
|
Ok bool `json:"ok"`
|
|
TaskChecklistItem *db.TaskChecklistItem `json:"taskChecklistItem"`
|
|
}
|
|
|
|
type DeleteTaskChecklistPayload struct {
|
|
Ok bool `json:"ok"`
|
|
TaskChecklist *db.TaskChecklist `json:"taskChecklist"`
|
|
}
|
|
|
|
type DeleteTaskGroupInput struct {
|
|
TaskGroupID uuid.UUID `json:"taskGroupID"`
|
|
}
|
|
|
|
type DeleteTaskGroupPayload struct {
|
|
Ok bool `json:"ok"`
|
|
AffectedRows int `json:"affectedRows"`
|
|
TaskGroup *db.TaskGroup `json:"taskGroup"`
|
|
}
|
|
|
|
type DeleteTaskInput struct {
|
|
TaskID string `json:"taskID"`
|
|
}
|
|
|
|
type DeleteTaskPayload struct {
|
|
TaskID string `json:"taskID"`
|
|
}
|
|
|
|
type DeleteTeam struct {
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
}
|
|
|
|
type DeleteTeamMember struct {
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
NewOwnerID *uuid.UUID `json:"newOwnerID"`
|
|
}
|
|
|
|
type DeleteTeamMemberPayload struct {
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
AffectedProjects []db.Project `json:"affectedProjects"`
|
|
}
|
|
|
|
type DeleteTeamPayload struct {
|
|
Ok bool `json:"ok"`
|
|
Team *db.Team `json:"team"`
|
|
Projects []db.Project `json:"projects"`
|
|
}
|
|
|
|
type DeleteUserAccount struct {
|
|
UserID uuid.UUID `json:"userID"`
|
|
NewOwnerID *uuid.UUID `json:"newOwnerID"`
|
|
}
|
|
|
|
type DeleteUserAccountPayload struct {
|
|
Ok bool `json:"ok"`
|
|
UserAccount *db.UserAccount `json:"userAccount"`
|
|
}
|
|
|
|
type FindProject struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
}
|
|
|
|
type FindTask struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
}
|
|
|
|
type FindTeam struct {
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
}
|
|
|
|
type FindUser struct {
|
|
UserID string `json:"userId"`
|
|
}
|
|
|
|
type LogoutUser struct {
|
|
UserID string `json:"userID"`
|
|
}
|
|
|
|
type MePayload struct {
|
|
User *db.UserAccount `json:"user"`
|
|
TeamRoles []TeamRole `json:"teamRoles"`
|
|
ProjectRoles []ProjectRole `json:"projectRoles"`
|
|
}
|
|
|
|
type Member struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Role *db.Role `json:"role"`
|
|
FullName string `json:"fullName"`
|
|
Username string `json:"username"`
|
|
ProfileIcon *ProfileIcon `json:"profileIcon"`
|
|
Owned *OwnedList `json:"owned"`
|
|
Member *MemberList `json:"member"`
|
|
}
|
|
|
|
type MemberList struct {
|
|
Teams []db.Team `json:"teams"`
|
|
Projects []db.Project `json:"projects"`
|
|
}
|
|
|
|
type NewProject struct {
|
|
UserID uuid.UUID `json:"userID"`
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type NewProjectLabel struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
LabelColorID uuid.UUID `json:"labelColorID"`
|
|
Name *string `json:"name"`
|
|
}
|
|
|
|
type NewRefreshToken struct {
|
|
UserID string `json:"userId"`
|
|
}
|
|
|
|
type NewTask struct {
|
|
TaskGroupID string `json:"taskGroupID"`
|
|
Name string `json:"name"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type NewTaskGroup struct {
|
|
ProjectID string `json:"projectID"`
|
|
Name string `json:"name"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type NewTaskGroupLocation struct {
|
|
TaskGroupID uuid.UUID `json:"taskGroupID"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type NewTaskLocation struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
TaskGroupID uuid.UUID `json:"taskGroupID"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type NewTeam struct {
|
|
Name string `json:"name"`
|
|
OrganizationID uuid.UUID `json:"organizationID"`
|
|
}
|
|
|
|
type NewUserAccount struct {
|
|
Username string `json:"username"`
|
|
Email string `json:"email"`
|
|
FullName string `json:"fullName"`
|
|
Initials string `json:"initials"`
|
|
Password string `json:"password"`
|
|
RoleCode string `json:"roleCode"`
|
|
}
|
|
|
|
type OwnedList struct {
|
|
Teams []db.Team `json:"teams"`
|
|
Projects []db.Project `json:"projects"`
|
|
}
|
|
|
|
type OwnersList struct {
|
|
Projects []uuid.UUID `json:"projects"`
|
|
Teams []uuid.UUID `json:"teams"`
|
|
}
|
|
|
|
type ProfileIcon struct {
|
|
URL *string `json:"url"`
|
|
Initials *string `json:"initials"`
|
|
BgColor *string `json:"bgColor"`
|
|
}
|
|
|
|
type ProjectRole struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
RoleCode RoleCode `json:"roleCode"`
|
|
}
|
|
|
|
type ProjectsFilter struct {
|
|
TeamID *uuid.UUID `json:"teamID"`
|
|
}
|
|
|
|
type RemoveTaskLabelInput struct {
|
|
TaskLabelID uuid.UUID `json:"taskLabelID"`
|
|
}
|
|
|
|
type SetTaskChecklistItemComplete struct {
|
|
TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"`
|
|
Complete bool `json:"complete"`
|
|
}
|
|
|
|
type SetTaskComplete struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
Complete bool `json:"complete"`
|
|
}
|
|
|
|
type TaskBadges struct {
|
|
Checklist *ChecklistBadge `json:"checklist"`
|
|
}
|
|
|
|
type TeamRole struct {
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
RoleCode RoleCode `json:"roleCode"`
|
|
}
|
|
|
|
type ToggleTaskLabelInput struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
ProjectLabelID uuid.UUID `json:"projectLabelID"`
|
|
}
|
|
|
|
type ToggleTaskLabelPayload struct {
|
|
Active bool `json:"active"`
|
|
Task *db.Task `json:"task"`
|
|
}
|
|
|
|
type UnassignTaskInput struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
}
|
|
|
|
type UpdateProjectLabel struct {
|
|
ProjectLabelID uuid.UUID `json:"projectLabelID"`
|
|
LabelColorID uuid.UUID `json:"labelColorID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateProjectLabelColor struct {
|
|
ProjectLabelID uuid.UUID `json:"projectLabelID"`
|
|
LabelColorID uuid.UUID `json:"labelColorID"`
|
|
}
|
|
|
|
type UpdateProjectLabelName struct {
|
|
ProjectLabelID uuid.UUID `json:"projectLabelID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateProjectMemberRole struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
RoleCode RoleCode `json:"roleCode"`
|
|
}
|
|
|
|
type UpdateProjectMemberRolePayload struct {
|
|
Ok bool `json:"ok"`
|
|
Member *Member `json:"member"`
|
|
}
|
|
|
|
type UpdateProjectName struct {
|
|
ProjectID uuid.UUID `json:"projectID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateTaskChecklistItemLocation struct {
|
|
ChecklistID uuid.UUID `json:"checklistID"`
|
|
ChecklistItemID uuid.UUID `json:"checklistItemID"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type UpdateTaskChecklistItemLocationPayload struct {
|
|
ChecklistID uuid.UUID `json:"checklistID"`
|
|
PrevChecklistID uuid.UUID `json:"prevChecklistID"`
|
|
ChecklistItem *db.TaskChecklistItem `json:"checklistItem"`
|
|
}
|
|
|
|
type UpdateTaskChecklistItemName struct {
|
|
TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateTaskChecklistLocation struct {
|
|
ChecklistID uuid.UUID `json:"checklistID"`
|
|
Position float64 `json:"position"`
|
|
}
|
|
|
|
type UpdateTaskChecklistLocationPayload struct {
|
|
Checklist *db.TaskChecklist `json:"checklist"`
|
|
}
|
|
|
|
type UpdateTaskChecklistName struct {
|
|
TaskChecklistID uuid.UUID `json:"taskChecklistID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateTaskDescriptionInput struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
type UpdateTaskDueDate struct {
|
|
TaskID uuid.UUID `json:"taskID"`
|
|
DueDate *time.Time `json:"dueDate"`
|
|
}
|
|
|
|
type UpdateTaskGroupName struct {
|
|
TaskGroupID uuid.UUID `json:"taskGroupID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateTaskLocationPayload struct {
|
|
PreviousTaskGroupID uuid.UUID `json:"previousTaskGroupID"`
|
|
Task *db.Task `json:"task"`
|
|
}
|
|
|
|
type UpdateTaskName struct {
|
|
TaskID string `json:"taskID"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UpdateTeamMemberRole struct {
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
UserID uuid.UUID `json:"userID"`
|
|
RoleCode RoleCode `json:"roleCode"`
|
|
}
|
|
|
|
type UpdateTeamMemberRolePayload struct {
|
|
Ok bool `json:"ok"`
|
|
TeamID uuid.UUID `json:"teamID"`
|
|
Member *Member `json:"member"`
|
|
}
|
|
|
|
type UpdateUserPassword struct {
|
|
UserID uuid.UUID `json:"userID"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
type UpdateUserPasswordPayload struct {
|
|
Ok bool `json:"ok"`
|
|
User *db.UserAccount `json:"user"`
|
|
}
|
|
|
|
type UpdateUserRole struct {
|
|
UserID uuid.UUID `json:"userID"`
|
|
RoleCode RoleCode `json:"roleCode"`
|
|
}
|
|
|
|
type UpdateUserRolePayload struct {
|
|
User *db.UserAccount `json:"user"`
|
|
}
|
|
|
|
type ActionLevel string
|
|
|
|
const (
|
|
ActionLevelOrg ActionLevel = "ORG"
|
|
ActionLevelTeam ActionLevel = "TEAM"
|
|
ActionLevelProject ActionLevel = "PROJECT"
|
|
)
|
|
|
|
var AllActionLevel = []ActionLevel{
|
|
ActionLevelOrg,
|
|
ActionLevelTeam,
|
|
ActionLevelProject,
|
|
}
|
|
|
|
func (e ActionLevel) IsValid() bool {
|
|
switch e {
|
|
case ActionLevelOrg, ActionLevelTeam, ActionLevelProject:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (e ActionLevel) String() string {
|
|
return string(e)
|
|
}
|
|
|
|
func (e *ActionLevel) UnmarshalGQL(v interface{}) error {
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
return fmt.Errorf("enums must be strings")
|
|
}
|
|
|
|
*e = ActionLevel(str)
|
|
if !e.IsValid() {
|
|
return fmt.Errorf("%s is not a valid ActionLevel", str)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e ActionLevel) MarshalGQL(w io.Writer) {
|
|
fmt.Fprint(w, strconv.Quote(e.String()))
|
|
}
|
|
|
|
type ObjectType string
|
|
|
|
const (
|
|
ObjectTypeOrg ObjectType = "ORG"
|
|
ObjectTypeTeam ObjectType = "TEAM"
|
|
ObjectTypeProject ObjectType = "PROJECT"
|
|
ObjectTypeTask ObjectType = "TASK"
|
|
)
|
|
|
|
var AllObjectType = []ObjectType{
|
|
ObjectTypeOrg,
|
|
ObjectTypeTeam,
|
|
ObjectTypeProject,
|
|
ObjectTypeTask,
|
|
}
|
|
|
|
func (e ObjectType) IsValid() bool {
|
|
switch e {
|
|
case ObjectTypeOrg, ObjectTypeTeam, ObjectTypeProject, ObjectTypeTask:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (e ObjectType) String() string {
|
|
return string(e)
|
|
}
|
|
|
|
func (e *ObjectType) UnmarshalGQL(v interface{}) error {
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
return fmt.Errorf("enums must be strings")
|
|
}
|
|
|
|
*e = ObjectType(str)
|
|
if !e.IsValid() {
|
|
return fmt.Errorf("%s is not a valid ObjectType", str)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e ObjectType) MarshalGQL(w io.Writer) {
|
|
fmt.Fprint(w, strconv.Quote(e.String()))
|
|
}
|
|
|
|
type RoleCode string
|
|
|
|
const (
|
|
RoleCodeOwner RoleCode = "owner"
|
|
RoleCodeAdmin RoleCode = "admin"
|
|
RoleCodeMember RoleCode = "member"
|
|
RoleCodeObserver RoleCode = "observer"
|
|
)
|
|
|
|
var AllRoleCode = []RoleCode{
|
|
RoleCodeOwner,
|
|
RoleCodeAdmin,
|
|
RoleCodeMember,
|
|
RoleCodeObserver,
|
|
}
|
|
|
|
func (e RoleCode) IsValid() bool {
|
|
switch e {
|
|
case RoleCodeOwner, RoleCodeAdmin, RoleCodeMember, RoleCodeObserver:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (e RoleCode) String() string {
|
|
return string(e)
|
|
}
|
|
|
|
func (e *RoleCode) UnmarshalGQL(v interface{}) error {
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
return fmt.Errorf("enums must be strings")
|
|
}
|
|
|
|
*e = RoleCode(str)
|
|
if !e.IsValid() {
|
|
return fmt.Errorf("%s is not a valid RoleCode", str)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e RoleCode) MarshalGQL(w io.Writer) {
|
|
fmt.Fprint(w, strconv.Quote(e.String()))
|
|
}
|
|
|
|
type RoleLevel string
|
|
|
|
const (
|
|
RoleLevelAdmin RoleLevel = "ADMIN"
|
|
RoleLevelMember RoleLevel = "MEMBER"
|
|
)
|
|
|
|
var AllRoleLevel = []RoleLevel{
|
|
RoleLevelAdmin,
|
|
RoleLevelMember,
|
|
}
|
|
|
|
func (e RoleLevel) IsValid() bool {
|
|
switch e {
|
|
case RoleLevelAdmin, RoleLevelMember:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (e RoleLevel) String() string {
|
|
return string(e)
|
|
}
|
|
|
|
func (e *RoleLevel) UnmarshalGQL(v interface{}) error {
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
return fmt.Errorf("enums must be strings")
|
|
}
|
|
|
|
*e = RoleLevel(str)
|
|
if !e.IsValid() {
|
|
return fmt.Errorf("%s is not a valid RoleLevel", str)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e RoleLevel) MarshalGQL(w io.Writer) {
|
|
fmt.Fprint(w, strconv.Quote(e.String()))
|
|
}
|