converters.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package graph
  2. import (
  3. "strconv"
  4. "time"
  5. "gogs.dmsc.dev/arp/graph/model"
  6. "gogs.dmsc.dev/arp/models"
  7. )
  8. // ID helpers for converting between string IDs (GraphQL) and uint IDs (database)
  9. func toID(s string) (uint, error) {
  10. id, err := strconv.ParseUint(s, 10, 32)
  11. return uint(id), err
  12. }
  13. // convertUser converts models.User to model.User
  14. func convertUser(u models.User) *model.User {
  15. roles := make([]*model.Role, len(u.Roles))
  16. for i, r := range u.Roles {
  17. roles[i] = &model.Role{
  18. ID: strconv.FormatUint(uint64(r.ID), 10),
  19. Name: r.Name,
  20. Description: r.Description,
  21. Permissions: convertPermissions(r.Permissions),
  22. }
  23. }
  24. return &model.User{
  25. ID: strconv.FormatUint(uint64(u.ID), 10),
  26. Email: u.Email,
  27. Password: u.Password,
  28. Roles: roles,
  29. CreatedAt: u.CreatedAt.String(),
  30. UpdatedAt: u.UpdatedAt.String(),
  31. }
  32. }
  33. // convertUsers converts []models.User to []*model.User
  34. func convertUsers(users []models.User) []*model.User {
  35. result := make([]*model.User, len(users))
  36. for i, u := range users {
  37. result[i] = convertUser(u)
  38. }
  39. return result
  40. }
  41. // convertNote converts models.Note to model.Note
  42. func convertNote(n models.Note) *model.Note {
  43. userID := strconv.FormatUint(uint64(n.UserID), 10)
  44. serviceID := strconv.FormatUint(uint64(n.ServiceID), 10)
  45. return &model.Note{
  46. ID: strconv.FormatUint(uint64(n.ID), 10),
  47. Title: n.Title,
  48. Content: n.Content,
  49. UserID: userID,
  50. ServiceID: serviceID,
  51. CreatedAt: n.CreatedAt.String(),
  52. UpdatedAt: n.UpdatedAt.String(),
  53. }
  54. }
  55. // convertNotes converts []models.Note to []*model.Note
  56. func convertNotes(notes []models.Note) []*model.Note {
  57. result := make([]*model.Note, len(notes))
  58. for i, n := range notes {
  59. result[i] = convertNote(n)
  60. }
  61. return result
  62. }
  63. // convertRole converts models.Role to model.Role
  64. func convertRole(r models.Role) *model.Role {
  65. permissions := make([]*model.Permission, len(r.Permissions))
  66. for i, p := range r.Permissions {
  67. permissions[i] = &model.Permission{
  68. ID: strconv.FormatUint(uint64(p.ID), 10),
  69. Code: p.Code,
  70. Description: p.Description,
  71. }
  72. }
  73. return &model.Role{
  74. ID: strconv.FormatUint(uint64(r.ID), 10),
  75. Name: r.Name,
  76. Description: r.Description,
  77. Permissions: permissions,
  78. }
  79. }
  80. // convertRoles converts []models.Role to []*model.Role
  81. func convertRoles(roles []models.Role) []*model.Role {
  82. result := make([]*model.Role, len(roles))
  83. for i, r := range roles {
  84. result[i] = convertRole(r)
  85. }
  86. return result
  87. }
  88. // convertPermission converts models.Permission to model.Permission
  89. func convertPermission(p models.Permission) *model.Permission {
  90. return &model.Permission{
  91. ID: strconv.FormatUint(uint64(p.ID), 10),
  92. Code: p.Code,
  93. Description: p.Description,
  94. }
  95. }
  96. // convertPermissions converts []models.Permission to []*model.Permission
  97. func convertPermissions(perms []models.Permission) []*model.Permission {
  98. result := make([]*model.Permission, len(perms))
  99. for i, p := range perms {
  100. result[i] = convertPermission(p)
  101. }
  102. return result
  103. }
  104. // convertService converts models.Service to model.Service
  105. func convertService(s models.Service) *model.Service {
  106. var desc *string
  107. if s.Description != "" {
  108. desc = &s.Description
  109. }
  110. createdByID := strconv.FormatUint(uint64(s.CreatedByID), 10)
  111. participants := make([]*model.User, len(s.Participants))
  112. for i, u := range s.Participants {
  113. participants[i] = convertUser(u)
  114. }
  115. tasks := make([]*model.Task, len(s.Tasks))
  116. for i, t := range s.Tasks {
  117. tasks[i] = convertTask(t)
  118. }
  119. return &model.Service{
  120. ID: strconv.FormatUint(uint64(s.ID), 10),
  121. Name: s.Name,
  122. Description: desc,
  123. CreatedByID: createdByID,
  124. Participants: participants,
  125. Tasks: tasks,
  126. CreatedAt: s.CreatedAt.String(),
  127. UpdatedAt: s.UpdatedAt.String(),
  128. }
  129. }
  130. // convertServices converts []models.Service to []*model.Service
  131. func convertServices(services []models.Service) []*model.Service {
  132. result := make([]*model.Service, len(services))
  133. for i, s := range services {
  134. result[i] = convertService(s)
  135. }
  136. return result
  137. }
  138. // convertTaskStatus converts models.TaskStatus to model.TaskStatus
  139. func convertTaskStatus(ts models.TaskStatus) *model.TaskStatus {
  140. tasks := make([]*model.Task, len(ts.Tasks))
  141. for i, t := range ts.Tasks {
  142. tasks[i] = convertTask(t)
  143. }
  144. return &model.TaskStatus{
  145. ID: strconv.FormatUint(uint64(ts.ID), 10),
  146. Code: ts.Code,
  147. Label: ts.Label,
  148. Tasks: tasks,
  149. CreatedAt: ts.CreatedAt.String(),
  150. UpdatedAt: ts.UpdatedAt.String(),
  151. }
  152. }
  153. // convertTaskStatuses converts []models.TaskStatus to []*model.TaskStatus
  154. func convertTaskStatuses(statuses []models.TaskStatus) []*model.TaskStatus {
  155. result := make([]*model.TaskStatus, len(statuses))
  156. for i, ts := range statuses {
  157. result[i] = convertTaskStatus(ts)
  158. }
  159. return result
  160. }
  161. // convertTask converts models.Task to model.Task
  162. func convertTask(t models.Task) *model.Task {
  163. var dueDate *string
  164. if t.DueDate != nil {
  165. formatted := t.DueDate.Format(time.RFC3339)
  166. dueDate = &formatted
  167. }
  168. var statusID *string
  169. var status *model.TaskStatus
  170. if t.Status.ID > 0 {
  171. sid := strconv.FormatUint(uint64(t.StatusID), 10)
  172. statusID = &sid
  173. status = convertTaskStatus(t.Status)
  174. }
  175. var assigneeID *string
  176. var assignee *model.User
  177. if t.AssigneeID != nil && t.Assignee != nil {
  178. aid := strconv.FormatUint(uint64(*t.AssigneeID), 10)
  179. assigneeID = &aid
  180. assignee = convertUser(*t.Assignee)
  181. }
  182. return &model.Task{
  183. ID: strconv.FormatUint(uint64(t.ID), 10),
  184. Title: t.Title,
  185. Content: t.Content,
  186. CreatedByID: strconv.FormatUint(uint64(t.CreatedByID), 10),
  187. CreatedBy: convertUser(t.CreatedBy),
  188. UpdatedByID: strconv.FormatUint(uint64(t.UpdatedByID), 10),
  189. UpdatedBy: convertUser(t.UpdatedBy),
  190. AssigneeID: assigneeID,
  191. Assignee: assignee,
  192. StatusID: statusID,
  193. Status: status,
  194. DueDate: dueDate,
  195. Priority: t.Priority,
  196. CreatedAt: t.CreatedAt.String(),
  197. UpdatedAt: t.UpdatedAt.String(),
  198. }
  199. }
  200. // convertTasks converts []models.Task to []*model.Task
  201. func convertTasks(tasks []models.Task) []*model.Task {
  202. result := make([]*model.Task, len(tasks))
  203. for i, t := range tasks {
  204. result[i] = convertTask(t)
  205. }
  206. return result
  207. }
  208. // convertChannel converts models.Channel to model.Channel
  209. func convertChannel(c models.Channel) *model.Channel {
  210. participants := make([]*model.User, len(c.Participants))
  211. for i, u := range c.Participants {
  212. participants[i] = convertUser(u)
  213. }
  214. return &model.Channel{
  215. ID: strconv.FormatUint(uint64(c.ID), 10),
  216. Participants: participants,
  217. CreatedAt: c.CreatedAt.String(),
  218. UpdatedAt: c.UpdatedAt.String(),
  219. }
  220. }
  221. // convertChannels converts []models.Channel to []*model.Channel
  222. func convertChannels(channels []models.Channel) []*model.Channel {
  223. result := make([]*model.Channel, len(channels))
  224. for i, c := range channels {
  225. result[i] = convertChannel(c)
  226. }
  227. return result
  228. }
  229. // convertMessage converts models.Message to model.Message
  230. func convertMessage(m models.Message) *model.Message {
  231. return &model.Message{
  232. ID: strconv.FormatUint(uint64(m.ID), 10),
  233. ConversationID: strconv.FormatUint(uint64(m.ConversationID), 10),
  234. SenderID: strconv.FormatUint(uint64(m.SenderID), 10),
  235. Sender: convertUser(m.Sender),
  236. Content: m.Content,
  237. SentAt: m.SentAt.String(),
  238. CreatedAt: m.CreatedAt.String(),
  239. UpdatedAt: m.UpdatedAt.String(),
  240. }
  241. }
  242. // convertMessages converts []models.Message to []*model.Message
  243. func convertMessages(messages []models.Message) []*model.Message {
  244. result := make([]*model.Message, len(messages))
  245. for i, m := range messages {
  246. result[i] = convertMessage(m)
  247. }
  248. return result
  249. }