178 lines
6.2 KiB
Go
178 lines
6.2 KiB
Go
|
package graph
|
||
|
|
||
|
// 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"
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"github.com/google/uuid"
|
||
|
"github.com/jordanknott/taskcafe/internal/db"
|
||
|
"github.com/jordanknott/taskcafe/internal/logger"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
"github.com/vektah/gqlparser/v2/gqlerror"
|
||
|
)
|
||
|
|
||
|
func (r *mutationResolver) CreateTeamMember(ctx context.Context, input CreateTeamMember) (*CreateTeamMemberPayload, error) {
|
||
|
addedDate := time.Now().UTC()
|
||
|
team, err := r.Repository.GetTeamByID(ctx, input.TeamID)
|
||
|
if err != nil {
|
||
|
return &CreateTeamMemberPayload{}, err
|
||
|
}
|
||
|
_, err = r.Repository.CreateTeamMember(ctx, db.CreateTeamMemberParams{TeamID: input.TeamID, UserID: input.UserID, Addeddate: addedDate, RoleCode: RoleCodeMember.String()})
|
||
|
user, err := r.Repository.GetUserAccountByID(ctx, input.UserID)
|
||
|
if err != nil {
|
||
|
return &CreateTeamMemberPayload{}, err
|
||
|
}
|
||
|
var url *string
|
||
|
if user.ProfileAvatarUrl.Valid {
|
||
|
url = &user.ProfileAvatarUrl.String
|
||
|
}
|
||
|
profileIcon := &ProfileIcon{url, &user.Initials, &user.ProfileBgColor}
|
||
|
return &CreateTeamMemberPayload{
|
||
|
Team: &team,
|
||
|
TeamMember: &Member{
|
||
|
ID: user.UserID,
|
||
|
Username: user.Username,
|
||
|
FullName: user.FullName,
|
||
|
ProfileIcon: profileIcon,
|
||
|
Role: &db.Role{Code: "member", Name: "Member"},
|
||
|
}}, nil
|
||
|
}
|
||
|
|
||
|
func (r *mutationResolver) UpdateTeamMemberRole(ctx context.Context, input UpdateTeamMemberRole) (*UpdateTeamMemberRolePayload, error) {
|
||
|
user, err := r.Repository.GetUserAccountByID(ctx, input.UserID)
|
||
|
if err != nil {
|
||
|
logger.New(ctx).WithError(err).Error("get user account")
|
||
|
return &UpdateTeamMemberRolePayload{Ok: false}, err
|
||
|
}
|
||
|
_, err = r.Repository.UpdateTeamMemberRole(ctx, db.UpdateTeamMemberRoleParams{TeamID: input.TeamID,
|
||
|
UserID: input.UserID, RoleCode: input.RoleCode.String()})
|
||
|
if err != nil {
|
||
|
logger.New(ctx).WithError(err).Error("update project member role")
|
||
|
return &UpdateTeamMemberRolePayload{Ok: false}, err
|
||
|
}
|
||
|
role, err := r.Repository.GetRoleForTeamMember(ctx, db.GetRoleForTeamMemberParams{UserID: user.UserID, TeamID: input.TeamID})
|
||
|
if err != nil {
|
||
|
logger.New(ctx).WithError(err).Error("get role for project member")
|
||
|
return &UpdateTeamMemberRolePayload{Ok: false}, err
|
||
|
}
|
||
|
var url *string
|
||
|
if user.ProfileAvatarUrl.Valid {
|
||
|
url = &user.ProfileAvatarUrl.String
|
||
|
}
|
||
|
profileIcon := &ProfileIcon{url, &user.Initials, &user.ProfileBgColor}
|
||
|
if user.ProfileAvatarUrl.Valid {
|
||
|
url = &user.ProfileAvatarUrl.String
|
||
|
}
|
||
|
member := Member{ID: user.UserID, FullName: user.FullName, ProfileIcon: profileIcon,
|
||
|
Role: &db.Role{Code: role.Code, Name: role.Name},
|
||
|
}
|
||
|
return &UpdateTeamMemberRolePayload{Ok: true, Member: &member, TeamID: input.TeamID}, err
|
||
|
}
|
||
|
|
||
|
func (r *mutationResolver) DeleteTeamMember(ctx context.Context, input DeleteTeamMember) (*DeleteTeamMemberPayload, error) {
|
||
|
err := r.Repository.DeleteTeamMember(ctx, db.DeleteTeamMemberParams{TeamID: input.TeamID, UserID: input.UserID})
|
||
|
return &DeleteTeamMemberPayload{TeamID: input.TeamID, UserID: input.UserID}, err
|
||
|
}
|
||
|
|
||
|
func (r *mutationResolver) DeleteTeam(ctx context.Context, input DeleteTeam) (*DeleteTeamPayload, error) {
|
||
|
team, err := r.Repository.GetTeamByID(ctx, input.TeamID)
|
||
|
if err != nil {
|
||
|
logger.New(ctx).Error(err)
|
||
|
return &DeleteTeamPayload{Ok: false}, err
|
||
|
}
|
||
|
projects, err := r.Repository.GetAllProjectsForTeam(ctx, input.TeamID)
|
||
|
if err != nil {
|
||
|
logger.New(ctx).Error(err)
|
||
|
return &DeleteTeamPayload{Ok: false}, err
|
||
|
}
|
||
|
err = r.Repository.DeleteTeamByID(ctx, input.TeamID)
|
||
|
if err != nil {
|
||
|
logger.New(ctx).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) (*db.Team, error) {
|
||
|
userID, ok := GetUserID(ctx)
|
||
|
if !ok {
|
||
|
return &db.Team{}, nil
|
||
|
}
|
||
|
role, err := r.Repository.GetRoleForUserID(ctx, userID)
|
||
|
if err != nil {
|
||
|
log.WithError(err).Error("while creating team")
|
||
|
return &db.Team{}, nil
|
||
|
}
|
||
|
if ConvertToRoleCode(role.Code) != RoleCodeAdmin {
|
||
|
return &db.Team{}, &gqlerror.Error{
|
||
|
Message: "Must be an organization admin",
|
||
|
Extensions: map[string]interface{}{
|
||
|
"code": "0-400",
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
createdAt := time.Now().UTC()
|
||
|
team, err := r.Repository.CreateTeam(ctx, db.CreateTeamParams{OrganizationID: input.OrganizationID, CreatedAt: createdAt, Name: input.Name})
|
||
|
return &team, err
|
||
|
}
|
||
|
|
||
|
func (r *teamResolver) ID(ctx context.Context, obj *db.Team) (uuid.UUID, error) {
|
||
|
return obj.TeamID, nil
|
||
|
}
|
||
|
|
||
|
func (r *teamResolver) Permission(ctx context.Context, obj *db.Team) (*TeamPermission, error) {
|
||
|
panic(fmt.Errorf("not implemented"))
|
||
|
}
|
||
|
|
||
|
func (r *teamResolver) Members(ctx context.Context, obj *db.Team) ([]Member, error) {
|
||
|
members := []Member{}
|
||
|
|
||
|
teamMembers, err := r.Repository.GetTeamMembersForTeamID(ctx, obj.TeamID)
|
||
|
if err != nil {
|
||
|
logger.New(ctx).Error("get project members for project id")
|
||
|
return members, err
|
||
|
}
|
||
|
|
||
|
for _, teamMember := range teamMembers {
|
||
|
user, err := r.Repository.GetUserAccountByID(ctx, teamMember.UserID)
|
||
|
if err != nil {
|
||
|
logger.New(ctx).WithError(err).Error("get user account by ID")
|
||
|
return members, err
|
||
|
}
|
||
|
var url *string
|
||
|
if user.ProfileAvatarUrl.Valid {
|
||
|
url = &user.ProfileAvatarUrl.String
|
||
|
}
|
||
|
profileIcon := &ProfileIcon{url, &user.Initials, &user.ProfileBgColor}
|
||
|
role, err := r.Repository.GetRoleForTeamMember(ctx, db.GetRoleForTeamMemberParams{UserID: user.UserID, TeamID: obj.TeamID})
|
||
|
if err != nil {
|
||
|
logger.New(ctx).WithError(err).Error("get role for projet member by user ID")
|
||
|
return members, err
|
||
|
}
|
||
|
|
||
|
ownedList, err := GetOwnedList(ctx, r.Repository, user)
|
||
|
if err != nil {
|
||
|
return members, err
|
||
|
}
|
||
|
memberList, err := GetMemberList(ctx, r.Repository, user)
|
||
|
if err != nil {
|
||
|
return members, err
|
||
|
}
|
||
|
|
||
|
members = append(members, Member{ID: user.UserID, FullName: user.FullName, ProfileIcon: profileIcon,
|
||
|
Username: user.Username, Owned: ownedList, Member: memberList, Role: &db.Role{Code: role.Code, Name: role.Name},
|
||
|
})
|
||
|
}
|
||
|
return members, nil
|
||
|
}
|
||
|
|
||
|
// Team returns TeamResolver implementation.
|
||
|
func (r *Resolver) Team() TeamResolver { return &teamResolver{r} }
|
||
|
|
||
|
type teamResolver struct{ *Resolver }
|