feat: add pre-commit hooks & refactor code to pass linting
This commit is contained in:
@ -2405,7 +2405,7 @@ type Query {
|
||||
teams: [Team!]!
|
||||
labelColors: [LabelColor!]!
|
||||
taskGroups: [TaskGroup!]!
|
||||
me: MePayload!
|
||||
me: MePayload!
|
||||
}
|
||||
|
||||
type Mutation
|
||||
|
@ -18,7 +18,6 @@ import (
|
||||
"github.com/jordanknott/taskcafe/internal/auth"
|
||||
"github.com/jordanknott/taskcafe/internal/db"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/vektah/gqlparser/v2/gqlerror"
|
||||
)
|
||||
|
||||
// NewHandler returns a new graphql endpoint handler.
|
||||
@ -107,26 +106,32 @@ func NewPlaygroundHandler(endpoint string) http.Handler {
|
||||
return playground.Handler("GraphQL Playground", endpoint)
|
||||
}
|
||||
|
||||
// GetUserID retrieves the UserID out of a context
|
||||
func GetUserID(ctx context.Context) (uuid.UUID, bool) {
|
||||
userID, ok := ctx.Value("userID").(uuid.UUID)
|
||||
return userID, ok
|
||||
}
|
||||
|
||||
// GetUserRole retrieves the user role out of a context
|
||||
func GetUserRole(ctx context.Context) (auth.Role, bool) {
|
||||
role, ok := ctx.Value("org_role").(auth.Role)
|
||||
return role, ok
|
||||
}
|
||||
|
||||
// GetUser retrieves both the user id & user role out of a context
|
||||
func GetUser(ctx context.Context) (uuid.UUID, auth.Role, bool) {
|
||||
userID, userOK := GetUserID(ctx)
|
||||
role, roleOK := GetUserRole(ctx)
|
||||
return userID, role, userOK && roleOK
|
||||
}
|
||||
|
||||
// GetRestrictedMode retrieves the restricted mode code out of a context
|
||||
func GetRestrictedMode(ctx context.Context) (auth.RestrictedMode, bool) {
|
||||
restricted, ok := ctx.Value("restricted_mode").(auth.RestrictedMode)
|
||||
return restricted, ok
|
||||
}
|
||||
|
||||
// GetProjectRoles retrieves the team & project role for the given project ID
|
||||
func GetProjectRoles(ctx context.Context, r db.Repository, projectID uuid.UUID) (db.GetUserRolesForProjectRow, error) {
|
||||
userID, ok := GetUserID(ctx)
|
||||
if !ok {
|
||||
@ -135,6 +140,7 @@ func GetProjectRoles(ctx context.Context, r db.Repository, projectID uuid.UUID)
|
||||
return r.GetUserRolesForProject(ctx, db.GetUserRolesForProjectParams{UserID: userID, ProjectID: projectID})
|
||||
}
|
||||
|
||||
// ConvertToRoleCode converts a role code string to a RoleCode type
|
||||
func ConvertToRoleCode(r string) RoleCode {
|
||||
if r == RoleCodeAdmin.String() {
|
||||
return RoleCodeAdmin
|
||||
@ -144,47 +150,3 @@ func ConvertToRoleCode(r string) RoleCode {
|
||||
}
|
||||
return RoleCodeObserver
|
||||
}
|
||||
|
||||
func RequireTeamAdmin(ctx context.Context, r db.Repository, teamID uuid.UUID) error {
|
||||
userID, role, ok := GetUser(ctx)
|
||||
if !ok {
|
||||
return errors.New("internal: user id is not set")
|
||||
}
|
||||
teamRole, err := r.GetTeamRoleForUserID(ctx, db.GetTeamRoleForUserIDParams{UserID: userID, TeamID: teamID})
|
||||
isAdmin := role == auth.RoleAdmin
|
||||
isTeamAdmin := err == nil && ConvertToRoleCode(teamRole.RoleCode) == RoleCodeAdmin
|
||||
if !(isAdmin || isTeamAdmin) {
|
||||
return &gqlerror.Error{
|
||||
Message: "organization or team admin role required",
|
||||
Extensions: map[string]interface{}{
|
||||
"code": "2-400",
|
||||
},
|
||||
}
|
||||
} else if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func RequireProjectOrTeamAdmin(ctx context.Context, r db.Repository, projectID uuid.UUID) error {
|
||||
role, ok := GetUserRole(ctx)
|
||||
if !ok {
|
||||
return errors.New("user ID is not set")
|
||||
}
|
||||
if role == auth.RoleAdmin {
|
||||
return nil
|
||||
}
|
||||
roles, err := GetProjectRoles(ctx, r, projectID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !(roles.ProjectRole == "admin" || roles.TeamRole == "admin") {
|
||||
return &gqlerror.Error{
|
||||
Message: "You must be a team or project admin",
|
||||
Extensions: map[string]interface{}{
|
||||
"code": "4-400",
|
||||
},
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -7,9 +7,12 @@ import (
|
||||
"github.com/jordanknott/taskcafe/internal/db"
|
||||
)
|
||||
|
||||
// GetOwnedList todo: remove this
|
||||
func GetOwnedList(ctx context.Context, r db.Repository, user db.UserAccount) (*OwnedList, error) {
|
||||
return &OwnedList{}, nil
|
||||
}
|
||||
|
||||
// GetMemberList returns a list of projects the user is a member of
|
||||
func GetMemberList(ctx context.Context, r db.Repository, user db.UserAccount) (*MemberList, error) {
|
||||
projectMemberIDs, err := r.GetMemberProjectIDsForUserID(ctx, user.UserID)
|
||||
if err != sql.ErrNoRows && err != nil {
|
||||
|
@ -1,5 +1,6 @@
|
||||
//go:generate sh ../scripts/genSchema.sh
|
||||
//go:generate go run github.com/99designs/gqlgen
|
||||
|
||||
package graph
|
||||
|
||||
import (
|
||||
@ -8,6 +9,7 @@ import (
|
||||
"github.com/jordanknott/taskcafe/internal/db"
|
||||
)
|
||||
|
||||
// Resolver handles resolving GraphQL queries & mutations
|
||||
type Resolver struct {
|
||||
Repository db.Repository
|
||||
mu sync.Mutex
|
||||
|
@ -3,18 +3,21 @@ package graph
|
||||
import (
|
||||
"io"
|
||||
|
||||
"strconv"
|
||||
|
||||
"github.com/99designs/gqlgen/graphql"
|
||||
"github.com/google/uuid"
|
||||
"github.com/pkg/errors"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// MarshalUUID converts a UUID to JSON string
|
||||
func MarshalUUID(uuid uuid.UUID) graphql.Marshaler {
|
||||
return graphql.WriterFunc(func(w io.Writer) {
|
||||
w.Write([]byte(strconv.Quote(uuid.String())))
|
||||
})
|
||||
}
|
||||
|
||||
// UnmarshalUUID converts a String to a UUID
|
||||
func UnmarshalUUID(v interface{}) (uuid.UUID, error) {
|
||||
if uuidRaw, ok := v.(string); ok {
|
||||
return uuid.Parse(uuidRaw)
|
||||
|
@ -187,7 +187,7 @@ type Query {
|
||||
teams: [Team!]!
|
||||
labelColors: [LabelColor!]!
|
||||
taskGroups: [TaskGroup!]!
|
||||
me: MePayload!
|
||||
me: MePayload!
|
||||
}
|
||||
|
||||
type Mutation
|
||||
@ -663,4 +663,3 @@ type DeleteUserAccountPayload {
|
||||
ok: Boolean!
|
||||
userAccount: UserAccount!
|
||||
}
|
||||
|
||||
|
@ -800,11 +800,11 @@ func (r *queryResolver) Users(ctx context.Context) ([]db.UserAccount, error) {
|
||||
}
|
||||
|
||||
func (r *queryResolver) FindUser(ctx context.Context, input FindUser) (*db.UserAccount, error) {
|
||||
userId, err := uuid.Parse(input.UserID)
|
||||
userID, err := uuid.Parse(input.UserID)
|
||||
if err != nil {
|
||||
return &db.UserAccount{}, err
|
||||
}
|
||||
account, err := r.Repository.GetUserAccountByID(ctx, userId)
|
||||
account, err := r.Repository.GetUserAccountByID(ctx, userID)
|
||||
if err == sql.ErrNoRows {
|
||||
return &db.UserAccount{}, &gqlerror.Error{
|
||||
Message: "User not found",
|
||||
@ -1097,9 +1097,9 @@ func (r *taskResolver) Badges(ctx context.Context, obj *db.Task) (*TaskBadges, e
|
||||
return &TaskBadges{}, err
|
||||
}
|
||||
for _, item := range items {
|
||||
total += 1
|
||||
total++
|
||||
if item.Complete {
|
||||
complete += 1
|
||||
complete++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ type Query {
|
||||
teams: [Team!]!
|
||||
labelColors: [LabelColor!]!
|
||||
taskGroups: [TaskGroup!]!
|
||||
me: MePayload!
|
||||
me: MePayload!
|
||||
}
|
||||
|
||||
type Mutation
|
||||
|
@ -25,4 +25,3 @@ type DeleteProjectPayload {
|
||||
ok: Boolean!
|
||||
project: Project!
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user