1
0

schema.resolvers.go 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127
  1. package graph
  2. // This file will be automatically regenerated based on the schema, any resolver
  3. // implementations
  4. // will be copied through when generating and any unknown code will be moved to the end.
  5. // Code generated by github.com/99designs/gqlgen version v0.17.87
  6. import (
  7. "context"
  8. "errors"
  9. "fmt"
  10. "time"
  11. "gogs.dmsc.dev/arp/auth"
  12. "gogs.dmsc.dev/arp/graph/model"
  13. "gogs.dmsc.dev/arp/models"
  14. )
  15. // Login is the resolver for the login field.
  16. func (r *mutationResolver) Login(ctx context.Context, email string, password string) (*model.AuthPayload, error) {
  17. var user models.User
  18. if err := r.DB.Preload("Roles.Permissions").Where("email = ?", email).First(&user).Error; err != nil {
  19. return nil, errors.New("invalid credentials")
  20. }
  21. // Check password
  22. if !auth.CheckPassword(password, user.Password) {
  23. return nil, errors.New("invalid credentials")
  24. }
  25. token, err := auth.GenerateToken(user)
  26. if err != nil {
  27. return nil, fmt.Errorf("failed to generate token: %w", err)
  28. }
  29. return &model.AuthPayload{
  30. Token: token,
  31. User: convertUser(user),
  32. }, nil
  33. }
  34. // CreateUser is the resolver for the createUser field.
  35. func (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser) (*model.User, error) {
  36. roles := make([]models.Role, len(input.Roles))
  37. for i, roleIDStr := range input.Roles {
  38. roleID, err := toID(roleIDStr)
  39. if err != nil {
  40. return nil, fmt.Errorf("invalid role ID: %w", err)
  41. }
  42. var role models.Role
  43. if err := r.DB.First(&role, roleID).Error; err != nil {
  44. return nil, fmt.Errorf("role not found: %w", err)
  45. }
  46. roles[i] = role
  47. }
  48. // Hash the password before storing
  49. hashedPassword, err := auth.HashPassword(input.Password)
  50. if err != nil {
  51. return nil, fmt.Errorf("failed to hash password: %w", err)
  52. }
  53. user := models.User{
  54. Email: input.Email,
  55. Password: hashedPassword,
  56. Roles: roles,
  57. }
  58. if err := r.DB.Create(&user).Error; err != nil {
  59. return nil, fmt.Errorf("failed to create user: %w", err)
  60. }
  61. return convertUser(user), nil
  62. }
  63. // UpdateUser is the resolver for the updateUser field.
  64. func (r *mutationResolver) UpdateUser(ctx context.Context, id string, input model.UpdateUserInput) (*model.User, error) {
  65. // Auth check
  66. if !auth.HasPermission(ctx, "user:update") {
  67. return nil, errors.New("unauthorized: missing user:update permission")
  68. }
  69. userID, err := toID(id)
  70. if err != nil {
  71. return nil, fmt.Errorf("invalid user ID: %w", err)
  72. }
  73. var existing models.User
  74. if err := r.DB.First(&existing, userID).Error; err != nil {
  75. return nil, fmt.Errorf("user not found: %w", err)
  76. }
  77. if input.Email != nil {
  78. existing.Email = *input.Email
  79. }
  80. if input.Password != nil {
  81. // Hash the new password
  82. hashedPassword, err := auth.HashPassword(*input.Password)
  83. if err != nil {
  84. return nil, fmt.Errorf("failed to hash password: %w", err)
  85. }
  86. existing.Password = hashedPassword
  87. }
  88. if len(input.Roles) > 0 {
  89. roles := make([]models.Role, len(input.Roles))
  90. for i, roleIDStr := range input.Roles {
  91. roleID, err := toID(roleIDStr)
  92. if err != nil {
  93. return nil, fmt.Errorf("invalid role ID: %w", err)
  94. }
  95. var role models.Role
  96. if err := r.DB.First(&role, roleID).Error; err != nil {
  97. return nil, fmt.Errorf("role not found: %w", err)
  98. }
  99. roles[i] = role
  100. }
  101. existing.Roles = roles
  102. }
  103. if err := r.DB.Save(&existing).Error; err != nil {
  104. return nil, fmt.Errorf("failed to update user: %w", err)
  105. }
  106. return convertUser(existing), nil
  107. }
  108. // DeleteUser is the resolver for the deleteUser field.
  109. func (r *mutationResolver) DeleteUser(ctx context.Context, id string) (bool, error) {
  110. // Auth check
  111. if !auth.HasPermission(ctx, "user:delete") {
  112. return false, errors.New("unauthorized: missing user:delete permission")
  113. }
  114. userID, err := toID(id)
  115. if err != nil {
  116. return false, fmt.Errorf("invalid user ID: %w", err)
  117. }
  118. result := r.DB.Delete(&models.User{}, userID)
  119. if result.Error != nil {
  120. return false, fmt.Errorf("failed to delete user: %w", result.Error)
  121. }
  122. return result.RowsAffected > 0, nil
  123. }
  124. // CreateNote is the resolver for the createNote field.
  125. func (r *mutationResolver) CreateNote(ctx context.Context, input model.NewNote) (*model.Note, error) {
  126. userID, err := toID(input.UserID)
  127. if err != nil {
  128. return nil, fmt.Errorf("invalid user ID: %w", err)
  129. }
  130. serviceID, err := toID(input.ServiceID)
  131. if err != nil {
  132. return nil, fmt.Errorf("invalid service ID: %w", err)
  133. }
  134. note := models.Note{
  135. Title: input.Title,
  136. Content: input.Content,
  137. UserID: userID,
  138. ServiceID: serviceID,
  139. }
  140. if err := r.DB.Create(&note).Error; err != nil {
  141. return nil, fmt.Errorf("failed to create note: %w", err)
  142. }
  143. return convertNote(note), nil
  144. }
  145. // UpdateNote is the resolver for the updateNote field.
  146. func (r *mutationResolver) UpdateNote(ctx context.Context, id string, input model.UpdateNoteInput) (*model.Note, error) {
  147. // Auth check
  148. if !auth.HasPermission(ctx, "note:update") {
  149. return nil, errors.New("unauthorized: missing note:update permission")
  150. }
  151. noteID, err := toID(id)
  152. if err != nil {
  153. return nil, fmt.Errorf("invalid note ID: %w", err)
  154. }
  155. var existing models.Note
  156. if err := r.DB.First(&existing, noteID).Error; err != nil {
  157. return nil, fmt.Errorf("note not found: %w", err)
  158. }
  159. if input.Title != nil {
  160. existing.Title = *input.Title
  161. }
  162. if input.Content != nil {
  163. existing.Content = *input.Content
  164. }
  165. if input.UserID != nil {
  166. userID, err := toID(*input.UserID)
  167. if err != nil {
  168. return nil, fmt.Errorf("invalid user ID: %w", err)
  169. }
  170. existing.UserID = userID
  171. }
  172. if input.ServiceID != nil {
  173. serviceID, err := toID(*input.ServiceID)
  174. if err != nil {
  175. return nil, fmt.Errorf("invalid service ID: %w", err)
  176. }
  177. existing.ServiceID = serviceID
  178. }
  179. if err := r.DB.Save(&existing).Error; err != nil {
  180. return nil, fmt.Errorf("failed to update note: %w", err)
  181. }
  182. return convertNote(existing), nil
  183. }
  184. // DeleteNote is the resolver for the deleteNote field.
  185. func (r *mutationResolver) DeleteNote(ctx context.Context, id string) (bool, error) {
  186. // Auth check
  187. if !auth.HasPermission(ctx, "note:delete") {
  188. return false, errors.New("unauthorized: missing note:delete permission")
  189. }
  190. noteID, err := toID(id)
  191. if err != nil {
  192. return false, fmt.Errorf("invalid note ID: %w", err)
  193. }
  194. result := r.DB.Delete(&models.Note{}, noteID)
  195. if result.Error != nil {
  196. return false, fmt.Errorf("failed to delete note: %w", result.Error)
  197. }
  198. return result.RowsAffected > 0, nil
  199. }
  200. // CreateRole is the resolver for the createRole field.
  201. func (r *mutationResolver) CreateRole(ctx context.Context, input model.NewRole) (*model.Role, error) {
  202. permissions := make([]models.Permission, len(input.Permissions))
  203. for i, permIDStr := range input.Permissions {
  204. permID, err := toID(permIDStr)
  205. if err != nil {
  206. return nil, fmt.Errorf("invalid permission ID: %w", err)
  207. }
  208. var perm models.Permission
  209. if err := r.DB.First(&perm, permID).Error; err != nil {
  210. return nil, fmt.Errorf("permission not found: %w", err)
  211. }
  212. permissions[i] = perm
  213. }
  214. role := models.Role{
  215. Name: input.Name,
  216. Description: input.Description,
  217. Permissions: permissions,
  218. }
  219. if err := r.DB.Create(&role).Error; err != nil {
  220. return nil, fmt.Errorf("failed to create role: %w", err)
  221. }
  222. return convertRole(role), nil
  223. }
  224. // UpdateRole is the resolver for the updateRole field.
  225. func (r *mutationResolver) UpdateRole(ctx context.Context, id string, input model.UpdateRoleInput) (*model.Role, error) {
  226. // Auth check
  227. if !auth.HasPermission(ctx, "role:update") {
  228. return nil, errors.New("unauthorized: missing role:update permission")
  229. }
  230. roleID, err := toID(id)
  231. if err != nil {
  232. return nil, fmt.Errorf("invalid role ID: %w", err)
  233. }
  234. var existing models.Role
  235. if err := r.DB.First(&existing, roleID).Error; err != nil {
  236. return nil, fmt.Errorf("role not found: %w", err)
  237. }
  238. if input.Name != nil {
  239. existing.Name = *input.Name
  240. }
  241. if input.Description != nil {
  242. existing.Description = *input.Description
  243. }
  244. if len(input.Permissions) > 0 {
  245. permissions := make([]models.Permission, len(input.Permissions))
  246. for i, permIDStr := range input.Permissions {
  247. permID, err := toID(permIDStr)
  248. if err != nil {
  249. return nil, fmt.Errorf("invalid permission ID: %w", err)
  250. }
  251. var perm models.Permission
  252. if err := r.DB.First(&perm, permID).Error; err != nil {
  253. return nil, fmt.Errorf("permission not found: %w", err)
  254. }
  255. permissions[i] = perm
  256. }
  257. existing.Permissions = permissions
  258. }
  259. if err := r.DB.Save(&existing).Error; err != nil {
  260. return nil, fmt.Errorf("failed to update role: %w", err)
  261. }
  262. return convertRole(existing), nil
  263. }
  264. // DeleteRole is the resolver for the deleteRole field.
  265. func (r *mutationResolver) DeleteRole(ctx context.Context, id string) (bool, error) {
  266. // Auth check
  267. if !auth.HasPermission(ctx, "role:delete") {
  268. return false, errors.New("unauthorized: missing role:delete permission")
  269. }
  270. roleID, err := toID(id)
  271. if err != nil {
  272. return false, fmt.Errorf("invalid role ID: %w", err)
  273. }
  274. result := r.DB.Delete(&models.Role{}, roleID)
  275. if result.Error != nil {
  276. return false, fmt.Errorf("failed to delete role: %w", result.Error)
  277. }
  278. return result.RowsAffected > 0, nil
  279. }
  280. // CreatePermission is the resolver for the createPermission field.
  281. func (r *mutationResolver) CreatePermission(ctx context.Context, input model.NewPermission) (*model.Permission, error) {
  282. permission := models.Permission{
  283. Code: input.Code,
  284. Description: input.Description,
  285. }
  286. if err := r.DB.Create(&permission).Error; err != nil {
  287. return nil, fmt.Errorf("failed to create permission: %w", err)
  288. }
  289. return convertPermission(permission), nil
  290. }
  291. // UpdatePermission is the resolver for the updatePermission field.
  292. func (r *mutationResolver) UpdatePermission(ctx context.Context, id string, input model.UpdatePermissionInput) (*model.Permission, error) {
  293. // Auth check
  294. if !auth.HasPermission(ctx, "permission:update") {
  295. return nil, errors.New("unauthorized: missing permission:update permission")
  296. }
  297. permID, err := toID(id)
  298. if err != nil {
  299. return nil, fmt.Errorf("invalid permission ID: %w", err)
  300. }
  301. var existing models.Permission
  302. if err := r.DB.First(&existing, permID).Error; err != nil {
  303. return nil, fmt.Errorf("permission not found: %w", err)
  304. }
  305. if input.Code != nil {
  306. existing.Code = *input.Code
  307. }
  308. if input.Description != nil {
  309. existing.Description = *input.Description
  310. }
  311. if err := r.DB.Save(&existing).Error; err != nil {
  312. return nil, fmt.Errorf("failed to update permission: %w", err)
  313. }
  314. return convertPermission(existing), nil
  315. }
  316. // DeletePermission is the resolver for the deletePermission field.
  317. func (r *mutationResolver) DeletePermission(ctx context.Context, id string) (bool, error) {
  318. // Auth check
  319. if !auth.HasPermission(ctx, "permission:delete") {
  320. return false, errors.New("unauthorized: missing permission:delete permission")
  321. }
  322. permID, err := toID(id)
  323. if err != nil {
  324. return false, fmt.Errorf("invalid permission ID: %w", err)
  325. }
  326. result := r.DB.Delete(&models.Permission{}, permID)
  327. if result.Error != nil {
  328. return false, fmt.Errorf("failed to delete permission: %w", result.Error)
  329. }
  330. return result.RowsAffected > 0, nil
  331. }
  332. // CreateService is the resolver for the createService field.
  333. func (r *mutationResolver) CreateService(ctx context.Context, input model.NewService) (*model.Service, error) {
  334. createdByID, err := toID(input.CreatedByID)
  335. if err != nil {
  336. return nil, fmt.Errorf("invalid created by ID: %w", err)
  337. }
  338. service := models.Service{
  339. Name: input.Name,
  340. CreatedByID: createdByID,
  341. }
  342. if input.Description != nil {
  343. service.Description = *input.Description
  344. }
  345. // Add participants
  346. for _, participantIDStr := range input.Participants {
  347. participantID, err := toID(participantIDStr)
  348. if err != nil {
  349. return nil, fmt.Errorf("invalid participant ID: %w", err)
  350. }
  351. var user models.User
  352. if err := r.DB.First(&user, participantID).Error; err != nil {
  353. return nil, fmt.Errorf("participant not found: %w", err)
  354. }
  355. service.Participants = append(service.Participants, user)
  356. }
  357. if err := r.DB.Create(&service).Error; err != nil {
  358. return nil, fmt.Errorf("failed to create service: %w", err)
  359. }
  360. // Reload with associations
  361. r.DB.Preload("Participants").Preload("Tasks").First(&service, service.ID)
  362. return convertService(service), nil
  363. }
  364. // UpdateService is the resolver for the updateService field.
  365. func (r *mutationResolver) UpdateService(ctx context.Context, id string, input model.UpdateServiceInput) (*model.Service, error) {
  366. // Auth check
  367. if !auth.HasPermission(ctx, "service:update") {
  368. return nil, errors.New("unauthorized: missing service:update permission")
  369. }
  370. serviceID, err := toID(id)
  371. if err != nil {
  372. return nil, fmt.Errorf("invalid service ID: %w", err)
  373. }
  374. var existing models.Service
  375. if err := r.DB.Preload("Participants").First(&existing, serviceID).Error; err != nil {
  376. return nil, fmt.Errorf("service not found: %w", err)
  377. }
  378. if input.Name != nil {
  379. existing.Name = *input.Name
  380. }
  381. if input.Description != nil {
  382. existing.Description = *input.Description
  383. }
  384. if len(input.Participants) > 0 {
  385. participants := []models.User{}
  386. for _, participantIDStr := range input.Participants {
  387. participantID, err := toID(participantIDStr)
  388. if err != nil {
  389. return nil, fmt.Errorf("invalid participant ID: %w", err)
  390. }
  391. var user models.User
  392. if err := r.DB.First(&user, participantID).Error; err != nil {
  393. return nil, fmt.Errorf("participant not found: %w", err)
  394. }
  395. participants = append(participants, user)
  396. }
  397. existing.Participants = participants
  398. }
  399. if err := r.DB.Save(&existing).Error; err != nil {
  400. return nil, fmt.Errorf("failed to update service: %w", err)
  401. }
  402. // Reload with associations for response
  403. r.DB.Preload("Participants").Preload("Tasks").First(&existing, existing.ID)
  404. return convertService(existing), nil
  405. }
  406. // DeleteService is the resolver for the deleteService field.
  407. func (r *mutationResolver) DeleteService(ctx context.Context, id string) (bool, error) {
  408. // Auth check
  409. if !auth.HasPermission(ctx, "service:delete") {
  410. return false, errors.New("unauthorized: missing service:delete permission")
  411. }
  412. serviceID, err := toID(id)
  413. if err != nil {
  414. return false, fmt.Errorf("invalid service ID: %w", err)
  415. }
  416. result := r.DB.Delete(&models.Service{}, serviceID)
  417. if result.Error != nil {
  418. return false, fmt.Errorf("failed to delete service: %w", result.Error)
  419. }
  420. return result.RowsAffected > 0, nil
  421. }
  422. // CreateTask is the resolver for the createTask field.
  423. func (r *mutationResolver) CreateTask(ctx context.Context, input model.NewTask) (*model.Task, error) {
  424. createdByID, err := toID(input.CreatedByID)
  425. if err != nil {
  426. return nil, fmt.Errorf("invalid created by ID: %w", err)
  427. }
  428. task := models.Task{
  429. Title: input.Title,
  430. Content: input.Content,
  431. CreatedByID: createdByID,
  432. Priority: input.Priority,
  433. }
  434. if input.AssigneeID != nil {
  435. assigneeID, err := toID(*input.AssigneeID)
  436. if err != nil {
  437. return nil, fmt.Errorf("invalid assignee ID: %w", err)
  438. }
  439. task.AssigneeID = &assigneeID
  440. }
  441. if input.StatusID != nil {
  442. statusID, err := toID(*input.StatusID)
  443. if err != nil {
  444. return nil, fmt.Errorf("invalid status ID: %w", err)
  445. }
  446. task.StatusID = statusID
  447. }
  448. if input.DueDate != nil {
  449. parsedTime, parseErr := time.Parse(time.RFC3339, *input.DueDate)
  450. if parseErr != nil {
  451. return nil, fmt.Errorf("invalid due date format: %w", parseErr)
  452. }
  453. task.DueDate = &parsedTime
  454. }
  455. if err := r.DB.Create(&task).Error; err != nil {
  456. return nil, fmt.Errorf("failed to create task: %w", err)
  457. }
  458. // Reload with associations
  459. r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").First(&task, task.ID)
  460. return convertTask(task), nil
  461. }
  462. // UpdateTask is the resolver for the updateTask field.
  463. func (r *mutationResolver) UpdateTask(ctx context.Context, id string, input model.UpdateTaskInput) (*model.Task, error) {
  464. // Auth check
  465. if !auth.HasPermission(ctx, "task:update") {
  466. return nil, errors.New("unauthorized: missing task:update permission")
  467. }
  468. taskID, err := toID(id)
  469. if err != nil {
  470. return nil, fmt.Errorf("invalid task ID: %w", err)
  471. }
  472. var existing models.Task
  473. if err := r.DB.Preload("CreatedBy").Preload("Assignee").First(&existing, taskID).Error; err != nil {
  474. return nil, fmt.Errorf("task not found: %w", err)
  475. }
  476. if input.Title != nil {
  477. existing.Title = *input.Title
  478. }
  479. if input.Content != nil {
  480. existing.Content = *input.Content
  481. }
  482. if input.AssigneeID != nil {
  483. if *input.AssigneeID == "" {
  484. existing.AssigneeID = nil
  485. } else {
  486. assigneeID, err := toID(*input.AssigneeID)
  487. if err != nil {
  488. return nil, fmt.Errorf("invalid assignee ID: %w", err)
  489. }
  490. existing.AssigneeID = &assigneeID
  491. }
  492. }
  493. if input.StatusID != nil {
  494. if *input.StatusID == "" {
  495. existing.StatusID = 0
  496. } else {
  497. statusID, err := toID(*input.StatusID)
  498. if err != nil {
  499. return nil, fmt.Errorf("invalid status ID: %w", err)
  500. }
  501. existing.StatusID = statusID
  502. }
  503. }
  504. if input.DueDate != nil {
  505. if *input.DueDate == "" {
  506. existing.DueDate = nil
  507. } else {
  508. parsedTime, parseErr := time.Parse(time.RFC3339, *input.DueDate)
  509. if parseErr != nil {
  510. return nil, fmt.Errorf("invalid due date format: %w", parseErr)
  511. }
  512. existing.DueDate = &parsedTime
  513. }
  514. }
  515. if input.Priority != nil {
  516. existing.Priority = *input.Priority
  517. }
  518. if err := r.DB.Save(&existing).Error; err != nil {
  519. return nil, fmt.Errorf("failed to update task: %w", err)
  520. }
  521. // Reload with associations for response
  522. r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").First(&existing, existing.ID)
  523. return convertTask(existing), nil
  524. }
  525. // DeleteTask is the resolver for the deleteTask field.
  526. func (r *mutationResolver) DeleteTask(ctx context.Context, id string) (bool, error) {
  527. // Auth check
  528. if !auth.HasPermission(ctx, "task:delete") {
  529. return false, errors.New("unauthorized: missing task:delete permission")
  530. }
  531. taskID, err := toID(id)
  532. if err != nil {
  533. return false, fmt.Errorf("invalid task ID: %w", err)
  534. }
  535. result := r.DB.Delete(&models.Task{}, taskID)
  536. if result.Error != nil {
  537. return false, fmt.Errorf("failed to delete task: %w", result.Error)
  538. }
  539. return result.RowsAffected > 0, nil
  540. }
  541. // CreateTaskStatus is the resolver for the createTaskStatus field.
  542. func (r *mutationResolver) CreateTaskStatus(ctx context.Context, input model.NewTaskStatus) (*model.TaskStatus, error) {
  543. taskStatus := models.TaskStatus{
  544. Code: input.Code,
  545. Label: input.Label,
  546. }
  547. if err := r.DB.Create(&taskStatus).Error; err != nil {
  548. return nil, fmt.Errorf("failed to create task status: %w", err)
  549. }
  550. return convertTaskStatus(taskStatus), nil
  551. }
  552. // UpdateTaskStatus is the resolver for the updateTaskStatus field.
  553. func (r *mutationResolver) UpdateTaskStatus(ctx context.Context, id string, input model.UpdateTaskStatusInput) (*model.TaskStatus, error) {
  554. // Auth check
  555. if !auth.HasPermission(ctx, "taskstatus:update") {
  556. return nil, errors.New("unauthorized: missing taskstatus:update permission")
  557. }
  558. statusID, err := toID(id)
  559. if err != nil {
  560. return nil, fmt.Errorf("invalid task status ID: %w", err)
  561. }
  562. var existing models.TaskStatus
  563. if err := r.DB.First(&existing, statusID).Error; err != nil {
  564. return nil, fmt.Errorf("task status not found: %w", err)
  565. }
  566. if input.Code != nil {
  567. existing.Code = *input.Code
  568. }
  569. if input.Label != nil {
  570. existing.Label = *input.Label
  571. }
  572. if err := r.DB.Save(&existing).Error; err != nil {
  573. return nil, fmt.Errorf("failed to update task status: %w", err)
  574. }
  575. // Reload with tasks for response
  576. r.DB.Preload("Tasks").First(&existing, existing.ID)
  577. return convertTaskStatus(existing), nil
  578. }
  579. // DeleteTaskStatus is the resolver for the deleteTaskStatus field.
  580. func (r *mutationResolver) DeleteTaskStatus(ctx context.Context, id string) (bool, error) {
  581. // Auth check
  582. if !auth.HasPermission(ctx, "taskstatus:delete") {
  583. return false, errors.New("unauthorized: missing taskstatus:delete permission")
  584. }
  585. statusID, err := toID(id)
  586. if err != nil {
  587. return false, fmt.Errorf("invalid task status ID: %w", err)
  588. }
  589. result := r.DB.Delete(&models.TaskStatus{}, statusID)
  590. if result.Error != nil {
  591. return false, fmt.Errorf("failed to delete task status: %w", result.Error)
  592. }
  593. return result.RowsAffected > 0, nil
  594. }
  595. // CreateChannel is the resolver for the createChannel field.
  596. func (r *mutationResolver) CreateChannel(ctx context.Context, input model.NewChannel) (*model.Channel, error) {
  597. channel := models.Channel{}
  598. for _, participantIDStr := range input.Participants {
  599. participantID, err := toID(participantIDStr)
  600. if err != nil {
  601. return nil, fmt.Errorf("invalid participant ID: %w", err)
  602. }
  603. var user models.User
  604. if err := r.DB.First(&user, participantID).Error; err != nil {
  605. return nil, fmt.Errorf("participant not found: %w", err)
  606. }
  607. channel.Participants = append(channel.Participants, user)
  608. }
  609. if err := r.DB.Create(&channel).Error; err != nil {
  610. return nil, fmt.Errorf("failed to create channel: %w", err)
  611. }
  612. // Reload with participants
  613. r.DB.Preload("Participants").First(&channel, channel.ID)
  614. return convertChannel(channel), nil
  615. }
  616. // UpdateChannel is the resolver for the updateChannel field.
  617. func (r *mutationResolver) UpdateChannel(ctx context.Context, id string, input model.UpdateChannelInput) (*model.Channel, error) {
  618. // Auth check
  619. if !auth.HasPermission(ctx, "channel:update") {
  620. return nil, errors.New("unauthorized: missing channel:update permission")
  621. }
  622. channelID, err := toID(id)
  623. if err != nil {
  624. return nil, fmt.Errorf("invalid channel ID: %w", err)
  625. }
  626. var existing models.Channel
  627. if err := r.DB.Preload("Participants").First(&existing, channelID).Error; err != nil {
  628. return nil, fmt.Errorf("channel not found: %w", err)
  629. }
  630. participants := []models.User{}
  631. for _, participantIDStr := range input.Participants {
  632. participantID, err := toID(participantIDStr)
  633. if err != nil {
  634. return nil, fmt.Errorf("invalid participant ID: %w", err)
  635. }
  636. var user models.User
  637. if err := r.DB.First(&user, participantID).Error; err != nil {
  638. return nil, fmt.Errorf("participant not found: %w", err)
  639. }
  640. participants = append(participants, user)
  641. }
  642. existing.Participants = participants
  643. if err := r.DB.Save(&existing).Error; err != nil {
  644. return nil, fmt.Errorf("failed to update channel: %w", err)
  645. }
  646. return convertChannel(existing), nil
  647. }
  648. // DeleteChannel is the resolver for the deleteChannel field.
  649. func (r *mutationResolver) DeleteChannel(ctx context.Context, id string) (bool, error) {
  650. // Auth check
  651. if !auth.HasPermission(ctx, "channel:delete") {
  652. return false, errors.New("unauthorized: missing channel:delete permission")
  653. }
  654. channelID, err := toID(id)
  655. if err != nil {
  656. return false, fmt.Errorf("invalid channel ID: %w", err)
  657. }
  658. result := r.DB.Delete(&models.Channel{}, channelID)
  659. if result.Error != nil {
  660. return false, fmt.Errorf("failed to delete channel: %w", result.Error)
  661. }
  662. return result.RowsAffected > 0, nil
  663. }
  664. // CreateMessage is the resolver for the createMessage field.
  665. func (r *mutationResolver) CreateMessage(ctx context.Context, input model.NewMessage) (*model.Message, error) {
  666. conversationID, err := toID(input.ConversationID)
  667. if err != nil {
  668. return nil, fmt.Errorf("invalid conversation ID: %w", err)
  669. }
  670. senderID, err := toID(input.SenderID)
  671. if err != nil {
  672. return nil, fmt.Errorf("invalid sender ID: %w", err)
  673. }
  674. message := models.Message{
  675. ConversationID: conversationID,
  676. SenderID: senderID,
  677. Content: input.Content,
  678. }
  679. if err := r.DB.Create(&message).Error; err != nil {
  680. return nil, fmt.Errorf("failed to create message: %w", err)
  681. }
  682. // Reload with associations
  683. r.DB.Preload("Sender").First(&message, message.ID)
  684. return convertMessage(message), nil
  685. }
  686. // UpdateMessage is the resolver for the updateMessage field.
  687. func (r *mutationResolver) UpdateMessage(ctx context.Context, id string, input model.UpdateMessageInput) (*model.Message, error) {
  688. // Auth check
  689. if !auth.HasPermission(ctx, "message:update") {
  690. return nil, errors.New("unauthorized: missing message:update permission")
  691. }
  692. messageID, err := toID(id)
  693. if err != nil {
  694. return nil, fmt.Errorf("invalid message ID: %w", err)
  695. }
  696. var existing models.Message
  697. if err := r.DB.Preload("Sender").First(&existing, messageID).Error; err != nil {
  698. return nil, fmt.Errorf("message not found: %w", err)
  699. }
  700. if input.ConversationID != nil {
  701. conversationID, err := toID(*input.ConversationID)
  702. if err != nil {
  703. return nil, fmt.Errorf("invalid conversation ID: %w", err)
  704. }
  705. existing.ConversationID = conversationID
  706. }
  707. if input.SenderID != nil {
  708. senderID, err := toID(*input.SenderID)
  709. if err != nil {
  710. return nil, fmt.Errorf("invalid sender ID: %w", err)
  711. }
  712. existing.SenderID = senderID
  713. }
  714. if input.Content != nil {
  715. existing.Content = *input.Content
  716. }
  717. if err := r.DB.Save(&existing).Error; err != nil {
  718. return nil, fmt.Errorf("failed to update message: %w", err)
  719. }
  720. return convertMessage(existing), nil
  721. }
  722. // DeleteMessage is the resolver for the deleteMessage field.
  723. func (r *mutationResolver) DeleteMessage(ctx context.Context, id string) (bool, error) {
  724. // Auth check
  725. if !auth.HasPermission(ctx, "message:delete") {
  726. return false, errors.New("unauthorized: missing message:delete permission")
  727. }
  728. messageID, err := toID(id)
  729. if err != nil {
  730. return false, fmt.Errorf("invalid message ID: %w", err)
  731. }
  732. result := r.DB.Delete(&models.Message{}, messageID)
  733. if result.Error != nil {
  734. return false, fmt.Errorf("failed to delete message: %w", result.Error)
  735. }
  736. return result.RowsAffected > 0, nil
  737. }
  738. // Users is the resolver for the users field.
  739. func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
  740. var users []models.User
  741. if err := r.DB.Find(&users).Error; err != nil {
  742. return nil, fmt.Errorf("failed to fetch users: %w", err)
  743. }
  744. return convertUsers(users), nil
  745. }
  746. // User is the resolver for the user field.
  747. func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) {
  748. userID, err := toID(id)
  749. if err != nil {
  750. return nil, fmt.Errorf("invalid user ID: %w", err)
  751. }
  752. var user models.User
  753. if err := r.DB.Preload("Roles.Permissions").First(&user, userID).Error; err != nil {
  754. return nil, fmt.Errorf("user not found: %w", err)
  755. }
  756. return convertUser(user), nil
  757. }
  758. // Notes is the resolver for the notes field.
  759. func (r *queryResolver) Notes(ctx context.Context) ([]*model.Note, error) {
  760. var notes []models.Note
  761. if err := r.DB.Preload("User").Preload("Service").Find(&notes).Error; err != nil {
  762. return nil, fmt.Errorf("failed to fetch notes: %w", err)
  763. }
  764. return convertNotes(notes), nil
  765. }
  766. // Note is the resolver for the note field.
  767. func (r *queryResolver) Note(ctx context.Context, id string) (*model.Note, error) {
  768. noteID, err := toID(id)
  769. if err != nil {
  770. return nil, fmt.Errorf("invalid note ID: %w", err)
  771. }
  772. var note models.Note
  773. if err := r.DB.Preload("User").Preload("Service").First(&note, noteID).Error; err != nil {
  774. return nil, fmt.Errorf("note not found: %w", err)
  775. }
  776. return convertNote(note), nil
  777. }
  778. // Roles is the resolver for the roles field.
  779. func (r *queryResolver) Roles(ctx context.Context) ([]*model.Role, error) {
  780. var roles []models.Role
  781. if err := r.DB.Preload("Permissions").Find(&roles).Error; err != nil {
  782. return nil, fmt.Errorf("failed to fetch roles: %w", err)
  783. }
  784. return convertRoles(roles), nil
  785. }
  786. // Role is the resolver for the role field.
  787. func (r *queryResolver) Role(ctx context.Context, id string) (*model.Role, error) {
  788. roleID, err := toID(id)
  789. if err != nil {
  790. return nil, fmt.Errorf("invalid role ID: %w", err)
  791. }
  792. var role models.Role
  793. if err := r.DB.Preload("Permissions").First(&role, roleID).Error; err != nil {
  794. return nil, fmt.Errorf("role not found: %w", err)
  795. }
  796. return convertRole(role), nil
  797. }
  798. // Permissions is the resolver for the permissions field.
  799. func (r *queryResolver) Permissions(ctx context.Context) ([]*model.Permission, error) {
  800. var perms []models.Permission
  801. if err := r.DB.Find(&perms).Error; err != nil {
  802. return nil, fmt.Errorf("failed to fetch permissions: %w", err)
  803. }
  804. return convertPermissions(perms), nil
  805. }
  806. // Permission is the resolver for the permission field.
  807. func (r *queryResolver) Permission(ctx context.Context, id string) (*model.Permission, error) {
  808. permID, err := toID(id)
  809. if err != nil {
  810. return nil, fmt.Errorf("invalid permission ID: %w", err)
  811. }
  812. var perm models.Permission
  813. if err := r.DB.First(&perm, permID).Error; err != nil {
  814. return nil, fmt.Errorf("permission not found: %w", err)
  815. }
  816. return convertPermission(perm), nil
  817. }
  818. // Services is the resolver for the services field.
  819. func (r *queryResolver) Services(ctx context.Context) ([]*model.Service, error) {
  820. var services []models.Service
  821. if err := r.DB.Preload("CreatedBy").Preload("Participants").Preload("Tasks").Find(&services).Error; err != nil {
  822. return nil, fmt.Errorf("failed to fetch services: %w", err)
  823. }
  824. return convertServices(services), nil
  825. }
  826. // Service is the resolver for the service field.
  827. func (r *queryResolver) Service(ctx context.Context, id string) (*model.Service, error) {
  828. serviceID, err := toID(id)
  829. if err != nil {
  830. return nil, fmt.Errorf("invalid service ID: %w", err)
  831. }
  832. var service models.Service
  833. if err := r.DB.Preload("CreatedBy").Preload("Participants").Preload("Tasks").First(&service, serviceID).Error; err != nil {
  834. return nil, fmt.Errorf("service not found: %w", err)
  835. }
  836. return convertService(service), nil
  837. }
  838. // Tasks is the resolver for the tasks field.
  839. func (r *queryResolver) Tasks(ctx context.Context) ([]*model.Task, error) {
  840. var tasks []models.Task
  841. if err := r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").Find(&tasks).Error; err != nil {
  842. return nil, fmt.Errorf("failed to fetch tasks: %w", err)
  843. }
  844. return convertTasks(tasks), nil
  845. }
  846. // Task is the resolver for the task field.
  847. func (r *queryResolver) Task(ctx context.Context, id string) (*model.Task, error) {
  848. taskID, err := toID(id)
  849. if err != nil {
  850. return nil, fmt.Errorf("invalid task ID: %w", err)
  851. }
  852. var task models.Task
  853. if err := r.DB.Preload("CreatedBy").Preload("Assignee").Preload("Status").First(&task, taskID).Error; err != nil {
  854. return nil, fmt.Errorf("task not found: %w", err)
  855. }
  856. return convertTask(task), nil
  857. }
  858. // TaskStatuses is the resolver for the taskStatuses field.
  859. func (r *queryResolver) TaskStatuses(ctx context.Context) ([]*model.TaskStatus, error) {
  860. var statuses []models.TaskStatus
  861. if err := r.DB.Preload("Tasks").Find(&statuses).Error; err != nil {
  862. return nil, fmt.Errorf("failed to fetch task statuses: %w", err)
  863. }
  864. return convertTaskStatuses(statuses), nil
  865. }
  866. // TaskStatus is the resolver for the taskStatus field.
  867. func (r *queryResolver) TaskStatus(ctx context.Context, id string) (*model.TaskStatus, error) {
  868. statusID, err := toID(id)
  869. if err != nil {
  870. return nil, fmt.Errorf("invalid task status ID: %w", err)
  871. }
  872. var status models.TaskStatus
  873. if err := r.DB.Preload("Tasks").First(&status, statusID).Error; err != nil {
  874. return nil, fmt.Errorf("task status not found: %w", err)
  875. }
  876. return convertTaskStatus(status), nil
  877. }
  878. // Channels is the resolver for the channels field.
  879. func (r *queryResolver) Channels(ctx context.Context) ([]*model.Channel, error) {
  880. var channels []models.Channel
  881. if err := r.DB.Preload("Participants").Find(&channels).Error; err != nil {
  882. return nil, fmt.Errorf("failed to fetch channels: %w", err)
  883. }
  884. return convertChannels(channels), nil
  885. }
  886. // Channel is the resolver for the channel field.
  887. func (r *queryResolver) Channel(ctx context.Context, id string) (*model.Channel, error) {
  888. channelID, err := toID(id)
  889. if err != nil {
  890. return nil, fmt.Errorf("invalid channel ID: %w", err)
  891. }
  892. var channel models.Channel
  893. if err := r.DB.Preload("Participants").First(&channel, channelID).Error; err != nil {
  894. return nil, fmt.Errorf("channel not found: %w", err)
  895. }
  896. return convertChannel(channel), nil
  897. }
  898. // Messages is the resolver for the messages field.
  899. func (r *queryResolver) Messages(ctx context.Context) ([]*model.Message, error) {
  900. var messages []models.Message
  901. if err := r.DB.Preload("Sender").Find(&messages).Error; err != nil {
  902. return nil, fmt.Errorf("failed to fetch messages: %w", err)
  903. }
  904. return convertMessages(messages), nil
  905. }
  906. // Message is the resolver for the message field.
  907. func (r *queryResolver) Message(ctx context.Context, id string) (*model.Message, error) {
  908. messageID, err := toID(id)
  909. if err != nil {
  910. return nil, fmt.Errorf("invalid message ID: %w", err)
  911. }
  912. var message models.Message
  913. if err := r.DB.Preload("Sender").First(&message, messageID).Error; err != nil {
  914. return nil, fmt.Errorf("message not found: %w", err)
  915. }
  916. return convertMessage(message), nil
  917. }
  918. // TaskCreated is the resolver for the taskCreated field.
  919. func (r *subscriptionResolver) TaskCreated(ctx context.Context) (<-chan *model.Task, error) {
  920. return nil, nil
  921. }
  922. // TaskUpdated is the resolver for the taskUpdated field.
  923. func (r *subscriptionResolver) TaskUpdated(ctx context.Context) (<-chan *model.Task, error) {
  924. return nil, nil
  925. }
  926. // TaskDeleted is the resolver for the taskDeleted field.
  927. func (r *subscriptionResolver) TaskDeleted(ctx context.Context) (<-chan *model.Task, error) {
  928. return nil, nil
  929. }
  930. // MessageAdded is the resolver for the messageAdded field.
  931. func (r *subscriptionResolver) MessageAdded(ctx context.Context) (<-chan *model.Message, error) {
  932. return nil, nil
  933. }
  934. // Mutation returns MutationResolver implementation.
  935. func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} }
  936. // Query returns QueryResolver implementation.
  937. func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }
  938. // Subscription returns SubscriptionResolver implementation.
  939. func (r *Resolver) Subscription() SubscriptionResolver { return &subscriptionResolver{r} }
  940. type mutationResolver struct{ *Resolver }
  941. type queryResolver struct{ *Resolver }
  942. type subscriptionResolver struct{ *Resolver }