| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127 |
- 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.
- // Code generated by github.com/99designs/gqlgen version v0.17.87
- import (
- "context"
- "errors"
- "fmt"
- "time"
- "gogs.dmsc.dev/arp/auth"
- "gogs.dmsc.dev/arp/graph/model"
- "gogs.dmsc.dev/arp/models"
- )
- // Login is the resolver for the login field.
- func (r *mutationResolver) Login(ctx context.Context, email string, password string) (*model.AuthPayload, error) {
- var user models.User
- if err := r.DB.Preload("Roles.Permissions").Where("email = ?", email).First(&user).Error; err != nil {
- return nil, errors.New("invalid credentials")
- }
- // Check password
- if !auth.CheckPassword(password, user.Password) {
- return nil, errors.New("invalid credentials")
- }
- token, err := auth.GenerateToken(user)
- if err != nil {
- return nil, fmt.Errorf("failed to generate token: %w", err)
- }
- return &model.AuthPayload{
- Token: token,
- User: convertUser(user),
- }, nil
- }
- // CreateUser is the resolver for the createUser field.
- func (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser) (*model.User, error) {
- roles := make([]models.Role, len(input.Roles))
- for i, roleIDStr := range input.Roles {
- roleID, err := toID(roleIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid role ID: %w", err)
- }
- var role models.Role
- if err := r.DB.First(&role, roleID).Error; err != nil {
- return nil, fmt.Errorf("role not found: %w", err)
- }
- roles[i] = role
- }
- // Hash the password before storing
- hashedPassword, err := auth.HashPassword(input.Password)
- if err != nil {
- return nil, fmt.Errorf("failed to hash password: %w", err)
- }
- user := models.User{
- Email: input.Email,
- Password: hashedPassword,
- Roles: roles,
- }
- if err := r.DB.Create(&user).Error; err != nil {
- return nil, fmt.Errorf("failed to create user: %w", err)
- }
- return convertUser(user), nil
- }
- // UpdateUser is the resolver for the updateUser field.
- func (r *mutationResolver) UpdateUser(ctx context.Context, id string, input model.UpdateUserInput) (*model.User, error) {
- // Auth check
- if !auth.HasPermission(ctx, "user:update") {
- return nil, errors.New("unauthorized: missing user:update permission")
- }
- userID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid user ID: %w", err)
- }
- var existing models.User
- if err := r.DB.First(&existing, userID).Error; err != nil {
- return nil, fmt.Errorf("user not found: %w", err)
- }
- if input.Email != nil {
- existing.Email = *input.Email
- }
- if input.Password != nil {
- // Hash the new password
- hashedPassword, err := auth.HashPassword(*input.Password)
- if err != nil {
- return nil, fmt.Errorf("failed to hash password: %w", err)
- }
- existing.Password = hashedPassword
- }
- if len(input.Roles) > 0 {
- roles := make([]models.Role, len(input.Roles))
- for i, roleIDStr := range input.Roles {
- roleID, err := toID(roleIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid role ID: %w", err)
- }
- var role models.Role
- if err := r.DB.First(&role, roleID).Error; err != nil {
- return nil, fmt.Errorf("role not found: %w", err)
- }
- roles[i] = role
- }
- existing.Roles = roles
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update user: %w", err)
- }
- return convertUser(existing), nil
- }
- // DeleteUser is the resolver for the deleteUser field.
- func (r *mutationResolver) DeleteUser(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "user:delete") {
- return false, errors.New("unauthorized: missing user:delete permission")
- }
- userID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid user ID: %w", err)
- }
- result := r.DB.Delete(&models.User{}, userID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete user: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateNote is the resolver for the createNote field.
- func (r *mutationResolver) CreateNote(ctx context.Context, input model.NewNote) (*model.Note, error) {
- userID, err := toID(input.UserID)
- if err != nil {
- return nil, fmt.Errorf("invalid user ID: %w", err)
- }
- serviceID, err := toID(input.ServiceID)
- if err != nil {
- return nil, fmt.Errorf("invalid service ID: %w", err)
- }
- note := models.Note{
- Title: input.Title,
- Content: input.Content,
- UserID: userID,
- ServiceID: serviceID,
- }
- if err := r.DB.Create(¬e).Error; err != nil {
- return nil, fmt.Errorf("failed to create note: %w", err)
- }
- return convertNote(note), nil
- }
- // UpdateNote is the resolver for the updateNote field.
- func (r *mutationResolver) UpdateNote(ctx context.Context, id string, input model.UpdateNoteInput) (*model.Note, error) {
- // Auth check
- if !auth.HasPermission(ctx, "note:update") {
- return nil, errors.New("unauthorized: missing note:update permission")
- }
- noteID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid note ID: %w", err)
- }
- var existing models.Note
- if err := r.DB.First(&existing, noteID).Error; err != nil {
- return nil, fmt.Errorf("note not found: %w", err)
- }
- if input.Title != nil {
- existing.Title = *input.Title
- }
- if input.Content != nil {
- existing.Content = *input.Content
- }
- if input.UserID != nil {
- userID, err := toID(*input.UserID)
- if err != nil {
- return nil, fmt.Errorf("invalid user ID: %w", err)
- }
- existing.UserID = userID
- }
- if input.ServiceID != nil {
- serviceID, err := toID(*input.ServiceID)
- if err != nil {
- return nil, fmt.Errorf("invalid service ID: %w", err)
- }
- existing.ServiceID = serviceID
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update note: %w", err)
- }
- return convertNote(existing), nil
- }
- // DeleteNote is the resolver for the deleteNote field.
- func (r *mutationResolver) DeleteNote(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "note:delete") {
- return false, errors.New("unauthorized: missing note:delete permission")
- }
- noteID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid note ID: %w", err)
- }
- result := r.DB.Delete(&models.Note{}, noteID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete note: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateRole is the resolver for the createRole field.
- func (r *mutationResolver) CreateRole(ctx context.Context, input model.NewRole) (*model.Role, error) {
- permissions := make([]models.Permission, len(input.Permissions))
- for i, permIDStr := range input.Permissions {
- permID, err := toID(permIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid permission ID: %w", err)
- }
- var perm models.Permission
- if err := r.DB.First(&perm, permID).Error; err != nil {
- return nil, fmt.Errorf("permission not found: %w", err)
- }
- permissions[i] = perm
- }
- role := models.Role{
- Name: input.Name,
- Description: input.Description,
- Permissions: permissions,
- }
- if err := r.DB.Create(&role).Error; err != nil {
- return nil, fmt.Errorf("failed to create role: %w", err)
- }
- return convertRole(role), nil
- }
- // UpdateRole is the resolver for the updateRole field.
- func (r *mutationResolver) UpdateRole(ctx context.Context, id string, input model.UpdateRoleInput) (*model.Role, error) {
- // Auth check
- if !auth.HasPermission(ctx, "role:update") {
- return nil, errors.New("unauthorized: missing role:update permission")
- }
- roleID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid role ID: %w", err)
- }
- var existing models.Role
- if err := r.DB.First(&existing, roleID).Error; err != nil {
- return nil, fmt.Errorf("role not found: %w", err)
- }
- if input.Name != nil {
- existing.Name = *input.Name
- }
- if input.Description != nil {
- existing.Description = *input.Description
- }
- if len(input.Permissions) > 0 {
- permissions := make([]models.Permission, len(input.Permissions))
- for i, permIDStr := range input.Permissions {
- permID, err := toID(permIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid permission ID: %w", err)
- }
- var perm models.Permission
- if err := r.DB.First(&perm, permID).Error; err != nil {
- return nil, fmt.Errorf("permission not found: %w", err)
- }
- permissions[i] = perm
- }
- existing.Permissions = permissions
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update role: %w", err)
- }
- return convertRole(existing), nil
- }
- // DeleteRole is the resolver for the deleteRole field.
- func (r *mutationResolver) DeleteRole(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "role:delete") {
- return false, errors.New("unauthorized: missing role:delete permission")
- }
- roleID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid role ID: %w", err)
- }
- result := r.DB.Delete(&models.Role{}, roleID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete role: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreatePermission is the resolver for the createPermission field.
- func (r *mutationResolver) CreatePermission(ctx context.Context, input model.NewPermission) (*model.Permission, error) {
- permission := models.Permission{
- Code: input.Code,
- Description: input.Description,
- }
- if err := r.DB.Create(&permission).Error; err != nil {
- return nil, fmt.Errorf("failed to create permission: %w", err)
- }
- return convertPermission(permission), nil
- }
- // UpdatePermission is the resolver for the updatePermission field.
- func (r *mutationResolver) UpdatePermission(ctx context.Context, id string, input model.UpdatePermissionInput) (*model.Permission, error) {
- // Auth check
- if !auth.HasPermission(ctx, "permission:update") {
- return nil, errors.New("unauthorized: missing permission:update permission")
- }
- permID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid permission ID: %w", err)
- }
- var existing models.Permission
- if err := r.DB.First(&existing, permID).Error; err != nil {
- return nil, fmt.Errorf("permission not found: %w", err)
- }
- if input.Code != nil {
- existing.Code = *input.Code
- }
- if input.Description != nil {
- existing.Description = *input.Description
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update permission: %w", err)
- }
- return convertPermission(existing), nil
- }
- // DeletePermission is the resolver for the deletePermission field.
- func (r *mutationResolver) DeletePermission(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "permission:delete") {
- return false, errors.New("unauthorized: missing permission:delete permission")
- }
- permID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid permission ID: %w", err)
- }
- result := r.DB.Delete(&models.Permission{}, permID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete permission: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateService is the resolver for the createService field.
- func (r *mutationResolver) CreateService(ctx context.Context, input model.NewService) (*model.Service, error) {
- createdByID, err := toID(input.CreatedByID)
- if err != nil {
- return nil, fmt.Errorf("invalid created by ID: %w", err)
- }
- service := models.Service{
- Name: input.Name,
- CreatedByID: createdByID,
- }
- if input.Description != nil {
- service.Description = *input.Description
- }
- // Add participants
- for _, participantIDStr := range input.Participants {
- participantID, err := toID(participantIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid participant ID: %w", err)
- }
- var user models.User
- if err := r.DB.First(&user, participantID).Error; err != nil {
- return nil, fmt.Errorf("participant not found: %w", err)
- }
- service.Participants = append(service.Participants, user)
- }
- if err := r.DB.Create(&service).Error; err != nil {
- return nil, fmt.Errorf("failed to create service: %w", err)
- }
- // Reload with associations
- r.DB.Preload("Participants").Preload("Tasks").First(&service, service.ID)
- return convertService(service), nil
- }
- // UpdateService is the resolver for the updateService field.
- func (r *mutationResolver) UpdateService(ctx context.Context, id string, input model.UpdateServiceInput) (*model.Service, error) {
- // Auth check
- if !auth.HasPermission(ctx, "service:update") {
- return nil, errors.New("unauthorized: missing service:update permission")
- }
- serviceID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid service ID: %w", err)
- }
- var existing models.Service
- if err := r.DB.Preload("Participants").First(&existing, serviceID).Error; err != nil {
- return nil, fmt.Errorf("service not found: %w", err)
- }
- if input.Name != nil {
- existing.Name = *input.Name
- }
- if input.Description != nil {
- existing.Description = *input.Description
- }
- if len(input.Participants) > 0 {
- participants := []models.User{}
- for _, participantIDStr := range input.Participants {
- participantID, err := toID(participantIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid participant ID: %w", err)
- }
- var user models.User
- if err := r.DB.First(&user, participantID).Error; err != nil {
- return nil, fmt.Errorf("participant not found: %w", err)
- }
- participants = append(participants, user)
- }
- existing.Participants = participants
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update service: %w", err)
- }
- // Reload with associations for response
- r.DB.Preload("Participants").Preload("Tasks").First(&existing, existing.ID)
- return convertService(existing), nil
- }
- // DeleteService is the resolver for the deleteService field.
- func (r *mutationResolver) DeleteService(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "service:delete") {
- return false, errors.New("unauthorized: missing service:delete permission")
- }
- serviceID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid service ID: %w", err)
- }
- result := r.DB.Delete(&models.Service{}, serviceID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete service: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateTask is the resolver for the createTask field.
- func (r *mutationResolver) CreateTask(ctx context.Context, input model.NewTask) (*model.Task, error) {
- createdByID, err := toID(input.CreatedByID)
- if err != nil {
- return nil, fmt.Errorf("invalid created by ID: %w", err)
- }
- task := models.Task{
- Title: input.Title,
- Content: input.Content,
- CreatedByID: createdByID,
- Priority: input.Priority,
- }
- if input.AssigneeID != nil {
- assigneeID, err := toID(*input.AssigneeID)
- if err != nil {
- return nil, fmt.Errorf("invalid assignee ID: %w", err)
- }
- task.AssigneeID = &assigneeID
- }
- if input.StatusID != nil {
- statusID, err := toID(*input.StatusID)
- if err != nil {
- return nil, fmt.Errorf("invalid status ID: %w", err)
- }
- task.StatusID = statusID
- }
- if input.DueDate != nil {
- parsedTime, parseErr := time.Parse(time.RFC3339, *input.DueDate)
- if parseErr != nil {
- return nil, fmt.Errorf("invalid due date format: %w", parseErr)
- }
- task.DueDate = &parsedTime
- }
- if err := r.DB.Create(&task).Error; err != nil {
- return nil, fmt.Errorf("failed to create task: %w", err)
- }
- // Reload with associations
- r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").First(&task, task.ID)
- return convertTask(task), nil
- }
- // UpdateTask is the resolver for the updateTask field.
- func (r *mutationResolver) UpdateTask(ctx context.Context, id string, input model.UpdateTaskInput) (*model.Task, error) {
- // Auth check
- if !auth.HasPermission(ctx, "task:update") {
- return nil, errors.New("unauthorized: missing task:update permission")
- }
- taskID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid task ID: %w", err)
- }
- var existing models.Task
- if err := r.DB.Preload("CreatedBy").Preload("Assignee").First(&existing, taskID).Error; err != nil {
- return nil, fmt.Errorf("task not found: %w", err)
- }
- if input.Title != nil {
- existing.Title = *input.Title
- }
- if input.Content != nil {
- existing.Content = *input.Content
- }
- if input.AssigneeID != nil {
- if *input.AssigneeID == "" {
- existing.AssigneeID = nil
- } else {
- assigneeID, err := toID(*input.AssigneeID)
- if err != nil {
- return nil, fmt.Errorf("invalid assignee ID: %w", err)
- }
- existing.AssigneeID = &assigneeID
- }
- }
- if input.StatusID != nil {
- if *input.StatusID == "" {
- existing.StatusID = 0
- } else {
- statusID, err := toID(*input.StatusID)
- if err != nil {
- return nil, fmt.Errorf("invalid status ID: %w", err)
- }
- existing.StatusID = statusID
- }
- }
- if input.DueDate != nil {
- if *input.DueDate == "" {
- existing.DueDate = nil
- } else {
- parsedTime, parseErr := time.Parse(time.RFC3339, *input.DueDate)
- if parseErr != nil {
- return nil, fmt.Errorf("invalid due date format: %w", parseErr)
- }
- existing.DueDate = &parsedTime
- }
- }
- if input.Priority != nil {
- existing.Priority = *input.Priority
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update task: %w", err)
- }
- // Reload with associations for response
- r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").First(&existing, existing.ID)
- return convertTask(existing), nil
- }
- // DeleteTask is the resolver for the deleteTask field.
- func (r *mutationResolver) DeleteTask(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "task:delete") {
- return false, errors.New("unauthorized: missing task:delete permission")
- }
- taskID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid task ID: %w", err)
- }
- result := r.DB.Delete(&models.Task{}, taskID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete task: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateTaskStatus is the resolver for the createTaskStatus field.
- func (r *mutationResolver) CreateTaskStatus(ctx context.Context, input model.NewTaskStatus) (*model.TaskStatus, error) {
- taskStatus := models.TaskStatus{
- Code: input.Code,
- Label: input.Label,
- }
- if err := r.DB.Create(&taskStatus).Error; err != nil {
- return nil, fmt.Errorf("failed to create task status: %w", err)
- }
- return convertTaskStatus(taskStatus), nil
- }
- // UpdateTaskStatus is the resolver for the updateTaskStatus field.
- func (r *mutationResolver) UpdateTaskStatus(ctx context.Context, id string, input model.UpdateTaskStatusInput) (*model.TaskStatus, error) {
- // Auth check
- if !auth.HasPermission(ctx, "taskstatus:update") {
- return nil, errors.New("unauthorized: missing taskstatus:update permission")
- }
- statusID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid task status ID: %w", err)
- }
- var existing models.TaskStatus
- if err := r.DB.First(&existing, statusID).Error; err != nil {
- return nil, fmt.Errorf("task status not found: %w", err)
- }
- if input.Code != nil {
- existing.Code = *input.Code
- }
- if input.Label != nil {
- existing.Label = *input.Label
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update task status: %w", err)
- }
- // Reload with tasks for response
- r.DB.Preload("Tasks").First(&existing, existing.ID)
- return convertTaskStatus(existing), nil
- }
- // DeleteTaskStatus is the resolver for the deleteTaskStatus field.
- func (r *mutationResolver) DeleteTaskStatus(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "taskstatus:delete") {
- return false, errors.New("unauthorized: missing taskstatus:delete permission")
- }
- statusID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid task status ID: %w", err)
- }
- result := r.DB.Delete(&models.TaskStatus{}, statusID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete task status: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateChannel is the resolver for the createChannel field.
- func (r *mutationResolver) CreateChannel(ctx context.Context, input model.NewChannel) (*model.Channel, error) {
- channel := models.Channel{}
- for _, participantIDStr := range input.Participants {
- participantID, err := toID(participantIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid participant ID: %w", err)
- }
- var user models.User
- if err := r.DB.First(&user, participantID).Error; err != nil {
- return nil, fmt.Errorf("participant not found: %w", err)
- }
- channel.Participants = append(channel.Participants, user)
- }
- if err := r.DB.Create(&channel).Error; err != nil {
- return nil, fmt.Errorf("failed to create channel: %w", err)
- }
- // Reload with participants
- r.DB.Preload("Participants").First(&channel, channel.ID)
- return convertChannel(channel), nil
- }
- // UpdateChannel is the resolver for the updateChannel field.
- func (r *mutationResolver) UpdateChannel(ctx context.Context, id string, input model.UpdateChannelInput) (*model.Channel, error) {
- // Auth check
- if !auth.HasPermission(ctx, "channel:update") {
- return nil, errors.New("unauthorized: missing channel:update permission")
- }
- channelID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid channel ID: %w", err)
- }
- var existing models.Channel
- if err := r.DB.Preload("Participants").First(&existing, channelID).Error; err != nil {
- return nil, fmt.Errorf("channel not found: %w", err)
- }
- participants := []models.User{}
- for _, participantIDStr := range input.Participants {
- participantID, err := toID(participantIDStr)
- if err != nil {
- return nil, fmt.Errorf("invalid participant ID: %w", err)
- }
- var user models.User
- if err := r.DB.First(&user, participantID).Error; err != nil {
- return nil, fmt.Errorf("participant not found: %w", err)
- }
- participants = append(participants, user)
- }
- existing.Participants = participants
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update channel: %w", err)
- }
- return convertChannel(existing), nil
- }
- // DeleteChannel is the resolver for the deleteChannel field.
- func (r *mutationResolver) DeleteChannel(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "channel:delete") {
- return false, errors.New("unauthorized: missing channel:delete permission")
- }
- channelID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid channel ID: %w", err)
- }
- result := r.DB.Delete(&models.Channel{}, channelID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete channel: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // CreateMessage is the resolver for the createMessage field.
- func (r *mutationResolver) CreateMessage(ctx context.Context, input model.NewMessage) (*model.Message, error) {
- conversationID, err := toID(input.ConversationID)
- if err != nil {
- return nil, fmt.Errorf("invalid conversation ID: %w", err)
- }
- senderID, err := toID(input.SenderID)
- if err != nil {
- return nil, fmt.Errorf("invalid sender ID: %w", err)
- }
- message := models.Message{
- ConversationID: conversationID,
- SenderID: senderID,
- Content: input.Content,
- }
- if err := r.DB.Create(&message).Error; err != nil {
- return nil, fmt.Errorf("failed to create message: %w", err)
- }
- // Reload with associations
- r.DB.Preload("Sender").First(&message, message.ID)
- return convertMessage(message), nil
- }
- // UpdateMessage is the resolver for the updateMessage field.
- func (r *mutationResolver) UpdateMessage(ctx context.Context, id string, input model.UpdateMessageInput) (*model.Message, error) {
- // Auth check
- if !auth.HasPermission(ctx, "message:update") {
- return nil, errors.New("unauthorized: missing message:update permission")
- }
- messageID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid message ID: %w", err)
- }
- var existing models.Message
- if err := r.DB.Preload("Sender").First(&existing, messageID).Error; err != nil {
- return nil, fmt.Errorf("message not found: %w", err)
- }
- if input.ConversationID != nil {
- conversationID, err := toID(*input.ConversationID)
- if err != nil {
- return nil, fmt.Errorf("invalid conversation ID: %w", err)
- }
- existing.ConversationID = conversationID
- }
- if input.SenderID != nil {
- senderID, err := toID(*input.SenderID)
- if err != nil {
- return nil, fmt.Errorf("invalid sender ID: %w", err)
- }
- existing.SenderID = senderID
- }
- if input.Content != nil {
- existing.Content = *input.Content
- }
- if err := r.DB.Save(&existing).Error; err != nil {
- return nil, fmt.Errorf("failed to update message: %w", err)
- }
- return convertMessage(existing), nil
- }
- // DeleteMessage is the resolver for the deleteMessage field.
- func (r *mutationResolver) DeleteMessage(ctx context.Context, id string) (bool, error) {
- // Auth check
- if !auth.HasPermission(ctx, "message:delete") {
- return false, errors.New("unauthorized: missing message:delete permission")
- }
- messageID, err := toID(id)
- if err != nil {
- return false, fmt.Errorf("invalid message ID: %w", err)
- }
- result := r.DB.Delete(&models.Message{}, messageID)
- if result.Error != nil {
- return false, fmt.Errorf("failed to delete message: %w", result.Error)
- }
- return result.RowsAffected > 0, nil
- }
- // Users is the resolver for the users field.
- func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
- var users []models.User
- if err := r.DB.Find(&users).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch users: %w", err)
- }
- return convertUsers(users), nil
- }
- // User is the resolver for the user field.
- func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) {
- userID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid user ID: %w", err)
- }
- var user models.User
- if err := r.DB.Preload("Roles.Permissions").First(&user, userID).Error; err != nil {
- return nil, fmt.Errorf("user not found: %w", err)
- }
- return convertUser(user), nil
- }
- // Notes is the resolver for the notes field.
- func (r *queryResolver) Notes(ctx context.Context) ([]*model.Note, error) {
- var notes []models.Note
- if err := r.DB.Preload("User").Preload("Service").Find(¬es).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch notes: %w", err)
- }
- return convertNotes(notes), nil
- }
- // Note is the resolver for the note field.
- func (r *queryResolver) Note(ctx context.Context, id string) (*model.Note, error) {
- noteID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid note ID: %w", err)
- }
- var note models.Note
- if err := r.DB.Preload("User").Preload("Service").First(¬e, noteID).Error; err != nil {
- return nil, fmt.Errorf("note not found: %w", err)
- }
- return convertNote(note), nil
- }
- // Roles is the resolver for the roles field.
- func (r *queryResolver) Roles(ctx context.Context) ([]*model.Role, error) {
- var roles []models.Role
- if err := r.DB.Preload("Permissions").Find(&roles).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch roles: %w", err)
- }
- return convertRoles(roles), nil
- }
- // Role is the resolver for the role field.
- func (r *queryResolver) Role(ctx context.Context, id string) (*model.Role, error) {
- roleID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid role ID: %w", err)
- }
- var role models.Role
- if err := r.DB.Preload("Permissions").First(&role, roleID).Error; err != nil {
- return nil, fmt.Errorf("role not found: %w", err)
- }
- return convertRole(role), nil
- }
- // Permissions is the resolver for the permissions field.
- func (r *queryResolver) Permissions(ctx context.Context) ([]*model.Permission, error) {
- var perms []models.Permission
- if err := r.DB.Find(&perms).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch permissions: %w", err)
- }
- return convertPermissions(perms), nil
- }
- // Permission is the resolver for the permission field.
- func (r *queryResolver) Permission(ctx context.Context, id string) (*model.Permission, error) {
- permID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid permission ID: %w", err)
- }
- var perm models.Permission
- if err := r.DB.First(&perm, permID).Error; err != nil {
- return nil, fmt.Errorf("permission not found: %w", err)
- }
- return convertPermission(perm), nil
- }
- // Services is the resolver for the services field.
- func (r *queryResolver) Services(ctx context.Context) ([]*model.Service, error) {
- var services []models.Service
- if err := r.DB.Preload("CreatedBy").Preload("Participants").Preload("Tasks").Find(&services).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch services: %w", err)
- }
- return convertServices(services), nil
- }
- // Service is the resolver for the service field.
- func (r *queryResolver) Service(ctx context.Context, id string) (*model.Service, error) {
- serviceID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid service ID: %w", err)
- }
- var service models.Service
- if err := r.DB.Preload("CreatedBy").Preload("Participants").Preload("Tasks").First(&service, serviceID).Error; err != nil {
- return nil, fmt.Errorf("service not found: %w", err)
- }
- return convertService(service), nil
- }
- // Tasks is the resolver for the tasks field.
- func (r *queryResolver) Tasks(ctx context.Context) ([]*model.Task, error) {
- var tasks []models.Task
- if err := r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").Find(&tasks).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch tasks: %w", err)
- }
- return convertTasks(tasks), nil
- }
- // Task is the resolver for the task field.
- func (r *queryResolver) Task(ctx context.Context, id string) (*model.Task, error) {
- taskID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid task ID: %w", err)
- }
- var task models.Task
- if err := r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").First(&task, taskID).Error; err != nil {
- return nil, fmt.Errorf("task not found: %w", err)
- }
- return convertTask(task), nil
- }
- // TaskStatuses is the resolver for the taskStatuses field.
- func (r *queryResolver) TaskStatuses(ctx context.Context) ([]*model.TaskStatus, error) {
- var statuses []models.TaskStatus
- if err := r.DB.Preload("Tasks").Find(&statuses).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch task statuses: %w", err)
- }
- return convertTaskStatuses(statuses), nil
- }
- // TaskStatus is the resolver for the taskStatus field.
- func (r *queryResolver) TaskStatus(ctx context.Context, id string) (*model.TaskStatus, error) {
- statusID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid task status ID: %w", err)
- }
- var status models.TaskStatus
- if err := r.DB.Preload("Tasks").First(&status, statusID).Error; err != nil {
- return nil, fmt.Errorf("task status not found: %w", err)
- }
- return convertTaskStatus(status), nil
- }
- // Channels is the resolver for the channels field.
- func (r *queryResolver) Channels(ctx context.Context) ([]*model.Channel, error) {
- var channels []models.Channel
- if err := r.DB.Preload("Participants").Find(&channels).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch channels: %w", err)
- }
- return convertChannels(channels), nil
- }
- // Channel is the resolver for the channel field.
- func (r *queryResolver) Channel(ctx context.Context, id string) (*model.Channel, error) {
- channelID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid channel ID: %w", err)
- }
- var channel models.Channel
- if err := r.DB.Preload("Participants").First(&channel, channelID).Error; err != nil {
- return nil, fmt.Errorf("channel not found: %w", err)
- }
- return convertChannel(channel), nil
- }
- // Messages is the resolver for the messages field.
- func (r *queryResolver) Messages(ctx context.Context) ([]*model.Message, error) {
- var messages []models.Message
- if err := r.DB.Preload("Sender").Find(&messages).Error; err != nil {
- return nil, fmt.Errorf("failed to fetch messages: %w", err)
- }
- return convertMessages(messages), nil
- }
- // Message is the resolver for the message field.
- func (r *queryResolver) Message(ctx context.Context, id string) (*model.Message, error) {
- messageID, err := toID(id)
- if err != nil {
- return nil, fmt.Errorf("invalid message ID: %w", err)
- }
- var message models.Message
- if err := r.DB.Preload("Sender").First(&message, messageID).Error; err != nil {
- return nil, fmt.Errorf("message not found: %w", err)
- }
- return convertMessage(message), nil
- }
- // TaskCreated is the resolver for the taskCreated field.
- func (r *subscriptionResolver) TaskCreated(ctx context.Context) (<-chan *model.Task, error) {
- return nil, nil
- }
- // TaskUpdated is the resolver for the taskUpdated field.
- func (r *subscriptionResolver) TaskUpdated(ctx context.Context) (<-chan *model.Task, error) {
- return nil, nil
- }
- // TaskDeleted is the resolver for the taskDeleted field.
- func (r *subscriptionResolver) TaskDeleted(ctx context.Context) (<-chan *model.Task, error) {
- return nil, nil
- }
- // MessageAdded is the resolver for the messageAdded field.
- func (r *subscriptionResolver) MessageAdded(ctx context.Context) (<-chan *model.Message, error) {
- return nil, nil
- }
- // Mutation returns MutationResolver implementation.
- func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} }
- // Query returns QueryResolver implementation.
- func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }
- // Subscription returns SubscriptionResolver implementation.
- func (r *Resolver) Subscription() SubscriptionResolver { return &subscriptionResolver{r} }
- type mutationResolver struct{ *Resolver }
- type queryResolver struct{ *Resolver }
- type subscriptionResolver struct{ *Resolver }
|