feature: remove sidebar & redesign top navbar

This commit is contained in:
Jordan Knott
2020-06-23 15:20:53 -05:00
parent fd7c006b73
commit 57382de9d0
78 changed files with 4124 additions and 465 deletions

File diff suppressed because it is too large Load Diff

View File

@ -59,6 +59,10 @@ type DeleteProjectPayload struct {
Project *pg.Project `json:"project"`
}
type DeleteTaskChecklist struct {
TaskChecklistID uuid.UUID `json:"taskChecklistID"`
}
type DeleteTaskChecklistItem struct {
TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"`
}
@ -68,6 +72,11 @@ type DeleteTaskChecklistItemPayload struct {
TaskChecklistItem *pg.TaskChecklistItem `json:"taskChecklistItem"`
}
type DeleteTaskChecklistPayload struct {
Ok bool `json:"ok"`
TaskChecklist *pg.TaskChecklist `json:"taskChecklist"`
}
type DeleteTaskGroupInput struct {
TaskGroupID uuid.UUID `json:"taskGroupID"`
}
@ -86,6 +95,25 @@ type DeleteTaskPayload struct {
TaskID string `json:"taskID"`
}
type DeleteTeam struct {
TeamID uuid.UUID `json:"teamID"`
}
type DeleteTeamPayload struct {
Ok bool `json:"ok"`
Team *pg.Team `json:"team"`
Projects []pg.Project `json:"projects"`
}
type DeleteUserAccount struct {
UserID uuid.UUID `json:"userID"`
}
type DeleteUserAccountPayload struct {
Ok bool `json:"ok"`
UserAccount *pg.UserAccount `json:"userAccount"`
}
type FindProject struct {
ProjectID string `json:"projectId"`
}
@ -94,6 +122,10 @@ type FindTask struct {
TaskID uuid.UUID `json:"taskID"`
}
type FindTeam struct {
TeamID uuid.UUID `json:"teamID"`
}
type FindUser struct {
UserID string `json:"userId"`
}
@ -167,7 +199,7 @@ type ProjectMember struct {
}
type ProjectsFilter struct {
TeamID *string `json:"teamID"`
TeamID *uuid.UUID `json:"teamID"`
}
type RemoveTaskLabelInput struct {
@ -229,6 +261,11 @@ type UpdateTaskChecklistItemName struct {
Name string `json:"name"`
}
type UpdateTaskChecklistName struct {
TaskChecklistID uuid.UUID `json:"taskChecklistID"`
Name string `json:"name"`
}
type UpdateTaskDescriptionInput struct {
TaskID uuid.UUID `json:"taskID"`
Description string `json:"description"`

View File

@ -103,7 +103,7 @@ type Task {
}
input ProjectsFilter {
teamID: String
teamID: UUID
}
input FindUser {
@ -123,6 +123,10 @@ type Organization {
name: String!
}
input FindTeam {
teamID: UUID!
}
type Query {
organizations: [Organization!]!
users: [UserAccount!]!
@ -130,6 +134,7 @@ type Query {
findProject(input: FindProject!): Project!
findTask(input: FindTask!): Task!
projects(input: ProjectsFilter): [Project!]!
findTeam(input: FindTeam!): Team!
teams: [Team!]!
labelColors: [LabelColor!]!
taskGroups: [TaskGroup!]!
@ -356,11 +361,43 @@ type DeleteProjectPayload {
project: Project!
}
input DeleteTeam {
teamID: UUID!
}
type DeleteTeamPayload {
ok: Boolean!
team: Team!
projects: [Project!]!
}
input DeleteUserAccount {
userID: UUID!
}
type DeleteUserAccountPayload {
ok: Boolean!
userAccount: UserAccount!
}
input UpdateTaskChecklistName {
taskChecklistID: UUID!
name: String!
}
input DeleteTaskChecklist {
taskChecklistID: UUID!
}
type DeleteTaskChecklistPayload {
ok: Boolean!
taskChecklist: TaskChecklist!
}
type Mutation {
createRefreshToken(input: NewRefreshToken!): RefreshToken!
createUserAccount(input: NewUserAccount!): UserAccount!
deleteUserAccount(input: DeleteUserAccount!): DeleteUserAccountPayload!
deleteTeam(input: DeleteTeam!): DeleteTeamPayload!
createTeam(input: NewTeam!): Team!
clearProfileAvatar: UserAccount!
@ -386,6 +423,8 @@ type Mutation {
toggleTaskLabel(input: ToggleTaskLabelInput!): ToggleTaskLabelPayload!
createTaskChecklist(input: CreateTaskChecklist!): TaskChecklist!
deleteTaskChecklist(input: DeleteTaskChecklist!): DeleteTaskChecklistPayload!
updateTaskChecklistName(input: UpdateTaskChecklistName!): TaskChecklist!
createTaskChecklistItem(input: CreateTaskChecklistItem!): TaskChecklistItem!
updateTaskChecklistItemName(input: UpdateTaskChecklistItemName!): TaskChecklistItem!
setTaskChecklistItemComplete(input: SetTaskChecklistItemComplete!): TaskChecklistItem!

View File

@ -13,6 +13,7 @@ import (
"github.com/jordanknott/project-citadel/api/pg"
log "github.com/sirupsen/logrus"
"github.com/vektah/gqlparser/v2/gqlerror"
"golang.org/x/crypto/bcrypt"
)
func (r *labelColorResolver) ID(ctx context.Context, obj *pg.LabelColor) (uuid.UUID, error) {
@ -29,17 +30,54 @@ func (r *mutationResolver) CreateRefreshToken(ctx context.Context, input NewRefr
func (r *mutationResolver) CreateUserAccount(ctx context.Context, input NewUserAccount) (*pg.UserAccount, error) {
createdAt := time.Now().UTC()
hashedPwd, err := bcrypt.GenerateFromPassword([]byte(input.Password), 14)
if err != nil {
return &pg.UserAccount{}, err
}
userAccount, err := r.Repository.CreateUserAccount(ctx, pg.CreateUserAccountParams{
FullName: input.FullName,
Initials: input.Initials,
Email: input.Email,
Username: input.Username,
CreatedAt: createdAt,
PasswordHash: input.Password,
PasswordHash: string(hashedPwd),
})
return &userAccount, err
}
func (r *mutationResolver) DeleteUserAccount(ctx context.Context, input DeleteUserAccount) (*DeleteUserAccountPayload, error) {
user, err := r.Repository.GetUserAccountByID(ctx, input.UserID)
if err != nil {
return &DeleteUserAccountPayload{Ok: false}, err
}
err = r.Repository.DeleteUserAccountByID(ctx, input.UserID)
if err != nil {
return &DeleteUserAccountPayload{Ok: false}, err
}
return &DeleteUserAccountPayload{UserAccount: &user, Ok: true}, nil
}
func (r *mutationResolver) DeleteTeam(ctx context.Context, input DeleteTeam) (*DeleteTeamPayload, error) {
team, err := r.Repository.GetTeamByID(ctx, input.TeamID)
if err != nil {
log.Error(err)
return &DeleteTeamPayload{Ok: false}, err
}
projects, err := r.Repository.GetAllProjectsForTeam(ctx, input.TeamID)
if err != nil {
log.Error(err)
return &DeleteTeamPayload{Ok: false}, err
}
err = r.Repository.DeleteTeamByID(ctx, input.TeamID)
if err != nil {
log.Error(err)
return &DeleteTeamPayload{Ok: false}, err
}
return &DeleteTeamPayload{Ok: true, Team: &team, Projects: projects}, nil
}
func (r *mutationResolver) CreateTeam(ctx context.Context, input NewTeam) (*pg.Team, error) {
createdAt := time.Now().UTC()
team, err := r.Repository.CreateTeam(ctx, pg.CreateTeamParams{input.OrganizationID, createdAt, input.Name})
@ -277,6 +315,26 @@ func (r *mutationResolver) CreateTaskChecklist(ctx context.Context, input Create
return &taskChecklist, nil
}
func (r *mutationResolver) DeleteTaskChecklist(ctx context.Context, input DeleteTaskChecklist) (*DeleteTaskChecklistPayload, error) {
taskChecklist, err := r.Repository.GetTaskChecklistByID(ctx, input.TaskChecklistID)
if err != nil {
return &DeleteTaskChecklistPayload{Ok: false}, err
}
err = r.Repository.DeleteTaskChecklistByID(ctx, input.TaskChecklistID)
if err != nil {
return &DeleteTaskChecklistPayload{Ok: false}, err
}
return &DeleteTaskChecklistPayload{Ok: true, TaskChecklist: &taskChecklist}, nil
}
func (r *mutationResolver) UpdateTaskChecklistName(ctx context.Context, input UpdateTaskChecklistName) (*pg.TaskChecklist, error) {
checklist, err := r.Repository.UpdateTaskChecklistName(ctx, pg.UpdateTaskChecklistNameParams{TaskChecklistID: input.TaskChecklistID, Name: input.Name})
if err != nil {
return &pg.TaskChecklist{}, err
}
return &checklist, nil
}
func (r *mutationResolver) CreateTaskChecklistItem(ctx context.Context, input CreateTaskChecklistItem) (*pg.TaskChecklistItem, error) {
createdAt := time.Now().UTC()
taskChecklistItem, err := r.Repository.CreateTaskChecklistItem(ctx, pg.CreateTaskChecklistItemParams{
@ -475,6 +533,9 @@ func (r *projectResolver) TaskGroups(ctx context.Context, obj *pg.Project) ([]pg
func (r *projectResolver) Members(ctx context.Context, obj *pg.Project) ([]ProjectMember, error) {
user, err := r.Repository.GetUserAccountByID(ctx, obj.Owner)
members := []ProjectMember{}
if err == sql.ErrNoRows {
return members, nil
}
if err != nil {
return members, err
}
@ -561,15 +622,19 @@ func (r *queryResolver) FindTask(ctx context.Context, input FindTask) (*pg.Task,
func (r *queryResolver) Projects(ctx context.Context, input *ProjectsFilter) ([]pg.Project, error) {
if input != nil {
teamID, err := uuid.Parse(*input.TeamID)
if err != nil {
return []pg.Project{}, err
}
return r.Repository.GetAllProjectsForTeam(ctx, teamID)
return r.Repository.GetAllProjectsForTeam(ctx, *input.TeamID)
}
return r.Repository.GetAllProjects(ctx)
}
func (r *queryResolver) FindTeam(ctx context.Context, input FindTeam) (*pg.Team, error) {
team, err := r.Repository.GetTeamByID(ctx, input.TeamID)
if err != nil {
return &pg.Team{}, err
}
return &team, nil
}
func (r *queryResolver) Teams(ctx context.Context) ([]pg.Team, error) {
return r.Repository.GetAllTeams(ctx)
}
@ -727,6 +792,9 @@ func (r *teamResolver) ID(ctx context.Context, obj *pg.Team) (uuid.UUID, error)
func (r *teamResolver) Members(ctx context.Context, obj *pg.Team) ([]ProjectMember, error) {
teamMembers, err := r.Repository.GetTeamMembersForTeamID(ctx, obj.TeamID)
var projectMembers []ProjectMember
if err == sql.ErrNoRows {
return projectMembers, nil
}
if err != nil {
return projectMembers, err
}