1
0

converters.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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. Roles: roles,
  28. CreatedAt: u.CreatedAt.String(),
  29. UpdatedAt: u.UpdatedAt.String(),
  30. }
  31. }
  32. // convertUsers converts []models.User to []*model.User
  33. func convertUsers(users []models.User) []*model.User {
  34. result := make([]*model.User, len(users))
  35. for i, u := range users {
  36. result[i] = convertUser(u)
  37. }
  38. return result
  39. }
  40. // convertNote converts models.Note to model.Note
  41. func convertNote(n models.Note) *model.Note {
  42. userID := strconv.FormatUint(uint64(n.UserID), 10)
  43. serviceID := strconv.FormatUint(uint64(n.ServiceID), 10)
  44. var user *model.User
  45. if n.User.ID > 0 {
  46. user = convertUser(n.User)
  47. }
  48. var service *model.Service
  49. if n.Service.ID > 0 {
  50. service = convertService(n.Service)
  51. }
  52. return &model.Note{
  53. ID: strconv.FormatUint(uint64(n.ID), 10),
  54. Title: n.Title,
  55. Content: n.Content,
  56. UserID: userID,
  57. User: user,
  58. ServiceID: serviceID,
  59. Service: service,
  60. CreatedAt: n.CreatedAt.String(),
  61. UpdatedAt: n.UpdatedAt.String(),
  62. }
  63. }
  64. // convertNotes converts []models.Note to []*model.Note
  65. func convertNotes(notes []models.Note) []*model.Note {
  66. result := make([]*model.Note, len(notes))
  67. for i, n := range notes {
  68. result[i] = convertNote(n)
  69. }
  70. return result
  71. }
  72. // convertRole converts models.Role to model.Role
  73. func convertRole(r models.Role) *model.Role {
  74. permissions := make([]*model.Permission, len(r.Permissions))
  75. for i, p := range r.Permissions {
  76. permissions[i] = &model.Permission{
  77. ID: strconv.FormatUint(uint64(p.ID), 10),
  78. Code: p.Code,
  79. Description: p.Description,
  80. }
  81. }
  82. return &model.Role{
  83. ID: strconv.FormatUint(uint64(r.ID), 10),
  84. Name: r.Name,
  85. Description: r.Description,
  86. Permissions: permissions,
  87. }
  88. }
  89. // convertRoles converts []models.Role to []*model.Role
  90. func convertRoles(roles []models.Role) []*model.Role {
  91. result := make([]*model.Role, len(roles))
  92. for i, r := range roles {
  93. result[i] = convertRole(r)
  94. }
  95. return result
  96. }
  97. // convertPermission converts models.Permission to model.Permission
  98. func convertPermission(p models.Permission) *model.Permission {
  99. return &model.Permission{
  100. ID: strconv.FormatUint(uint64(p.ID), 10),
  101. Code: p.Code,
  102. Description: p.Description,
  103. }
  104. }
  105. // convertPermissions converts []models.Permission to []*model.Permission
  106. func convertPermissions(perms []models.Permission) []*model.Permission {
  107. result := make([]*model.Permission, len(perms))
  108. for i, p := range perms {
  109. result[i] = convertPermission(p)
  110. }
  111. return result
  112. }
  113. // convertService converts models.Service to model.Service
  114. func convertService(s models.Service) *model.Service {
  115. var desc *string
  116. if s.Description != "" {
  117. desc = &s.Description
  118. }
  119. createdByID := strconv.FormatUint(uint64(s.CreatedByID), 10)
  120. participants := make([]*model.User, len(s.Participants))
  121. for i, u := range s.Participants {
  122. participants[i] = convertUser(u)
  123. }
  124. tasks := make([]*model.Task, len(s.Tasks))
  125. for i, t := range s.Tasks {
  126. tasks[i] = convertTask(t)
  127. }
  128. return &model.Service{
  129. ID: strconv.FormatUint(uint64(s.ID), 10),
  130. Name: s.Name,
  131. Description: desc,
  132. CreatedByID: createdByID,
  133. CreatedBy: convertUser(s.CreatedBy),
  134. Participants: participants,
  135. Tasks: tasks,
  136. CreatedAt: s.CreatedAt.String(),
  137. UpdatedAt: s.UpdatedAt.String(),
  138. }
  139. }
  140. // convertServices converts []models.Service to []*model.Service
  141. func convertServices(services []models.Service) []*model.Service {
  142. result := make([]*model.Service, len(services))
  143. for i, s := range services {
  144. result[i] = convertService(s)
  145. }
  146. return result
  147. }
  148. // convertTaskStatus converts models.TaskStatus to model.TaskStatus
  149. func convertTaskStatus(ts models.TaskStatus) *model.TaskStatus {
  150. tasks := make([]*model.Task, len(ts.Tasks))
  151. for i, t := range ts.Tasks {
  152. tasks[i] = convertTask(t)
  153. }
  154. return &model.TaskStatus{
  155. ID: strconv.FormatUint(uint64(ts.ID), 10),
  156. Code: ts.Code,
  157. Label: ts.Label,
  158. Tasks: tasks,
  159. CreatedAt: ts.CreatedAt.String(),
  160. UpdatedAt: ts.UpdatedAt.String(),
  161. }
  162. }
  163. // convertTaskStatuses converts []models.TaskStatus to []*model.TaskStatus
  164. func convertTaskStatuses(statuses []models.TaskStatus) []*model.TaskStatus {
  165. result := make([]*model.TaskStatus, len(statuses))
  166. for i, ts := range statuses {
  167. result[i] = convertTaskStatus(ts)
  168. }
  169. return result
  170. }
  171. // convertTask converts models.Task to model.Task
  172. func convertTask(t models.Task) *model.Task {
  173. var dueDate *string
  174. if t.DueDate != nil {
  175. formatted := t.DueDate.Format(time.RFC3339)
  176. dueDate = &formatted
  177. }
  178. var statusID *string
  179. var status *model.TaskStatus
  180. if t.Status.ID > 0 {
  181. sid := strconv.FormatUint(uint64(t.StatusID), 10)
  182. statusID = &sid
  183. status = convertTaskStatus(t.Status)
  184. }
  185. var assigneeID *string
  186. var assignee *model.User
  187. if t.AssigneeID != nil && t.Assignee != nil {
  188. aid := strconv.FormatUint(uint64(*t.AssigneeID), 10)
  189. assigneeID = &aid
  190. assignee = convertUser(*t.Assignee)
  191. }
  192. return &model.Task{
  193. ID: strconv.FormatUint(uint64(t.ID), 10),
  194. Title: t.Title,
  195. Content: t.Content,
  196. CreatedByID: strconv.FormatUint(uint64(t.CreatedByID), 10),
  197. CreatedBy: convertUser(t.CreatedBy),
  198. UpdatedByID: strconv.FormatUint(uint64(t.UpdatedByID), 10),
  199. UpdatedBy: convertUser(t.UpdatedBy),
  200. AssigneeID: assigneeID,
  201. Assignee: assignee,
  202. StatusID: statusID,
  203. Status: status,
  204. DueDate: dueDate,
  205. Priority: t.Priority,
  206. CreatedAt: t.CreatedAt.String(),
  207. UpdatedAt: t.UpdatedAt.String(),
  208. }
  209. }
  210. // convertTasks converts []models.Task to []*model.Task
  211. func convertTasks(tasks []models.Task) []*model.Task {
  212. result := make([]*model.Task, len(tasks))
  213. for i, t := range tasks {
  214. result[i] = convertTask(t)
  215. }
  216. return result
  217. }
  218. // convertMessage converts models.Message to model.Message
  219. func convertMessage(m models.Message) *model.Message {
  220. receivers := make([]string, len(m.Receivers))
  221. receiverObjects := make([]*model.User, len(m.Receivers))
  222. for i, r := range m.Receivers {
  223. receivers[i] = strconv.FormatUint(uint64(r.ID), 10)
  224. receiverObjects[i] = convertUser(r)
  225. }
  226. return &model.Message{
  227. ID: strconv.FormatUint(uint64(m.ID), 10),
  228. SenderID: strconv.FormatUint(uint64(m.SenderID), 10),
  229. Sender: convertUser(m.Sender),
  230. Content: m.Content,
  231. SentAt: m.SentAt.String(),
  232. Receivers: receivers,
  233. ReceiverObjects: receiverObjects,
  234. CreatedAt: m.CreatedAt.String(),
  235. UpdatedAt: m.UpdatedAt.String(),
  236. }
  237. }
  238. // convertMessages converts []models.Message to []*model.Message
  239. func convertMessages(messages []models.Message) []*model.Message {
  240. result := make([]*model.Message, len(messages))
  241. for i, m := range messages {
  242. result[i] = convertMessage(m)
  243. }
  244. return result
  245. }
  246. // convertWorkflowTemplate converts models.WorkflowTemplate to model.WorkflowTemplate
  247. func convertWorkflowTemplate(w models.WorkflowTemplate) *model.WorkflowTemplate {
  248. var createdBy *model.User
  249. if w.CreatedBy.ID > 0 {
  250. createdBy = convertUser(w.CreatedBy)
  251. }
  252. return &model.WorkflowTemplate{
  253. ID: strconv.FormatUint(uint64(w.ID), 10),
  254. Name: w.Name,
  255. Description: func() *string {
  256. if w.Description != "" {
  257. return &w.Description
  258. }
  259. return nil
  260. }(),
  261. Definition: w.Definition,
  262. IsActive: w.IsActive,
  263. CreatedBy: createdBy,
  264. CreatedAt: w.CreatedAt.String(),
  265. UpdatedAt: w.UpdatedAt.String(),
  266. }
  267. }
  268. // convertWorkflowTemplates converts []models.WorkflowTemplate to []*model.WorkflowTemplate
  269. func convertWorkflowTemplates(templates []models.WorkflowTemplate) []*model.WorkflowTemplate {
  270. result := make([]*model.WorkflowTemplate, len(templates))
  271. for i, w := range templates {
  272. result[i] = convertWorkflowTemplate(w)
  273. }
  274. return result
  275. }
  276. // convertWorkflowInstance converts models.WorkflowInstance to model.WorkflowInstance
  277. func convertWorkflowInstance(w models.WorkflowInstance) *model.WorkflowInstance {
  278. template := convertWorkflowTemplate(w.WorkflowTemplate)
  279. var context *string
  280. if w.Context != "" {
  281. context = &w.Context
  282. }
  283. var service *model.Service
  284. if w.Service != nil && w.Service.ID > 0 {
  285. service = convertService(*w.Service)
  286. }
  287. var completedAt *string
  288. if w.CompletedAt != nil {
  289. completedAtVal := w.CompletedAt.String()
  290. completedAt = &completedAtVal
  291. }
  292. return &model.WorkflowInstance{
  293. ID: strconv.FormatUint(uint64(w.ID), 10),
  294. Template: template,
  295. Status: w.Status,
  296. Context: context,
  297. Service: service,
  298. CreatedAt: w.CreatedAt.String(),
  299. UpdatedAt: w.UpdatedAt.String(),
  300. CompletedAt: completedAt,
  301. }
  302. }
  303. // convertWorkflowInstances converts []models.WorkflowInstance to []*model.WorkflowInstance
  304. func convertWorkflowInstances(instances []models.WorkflowInstance) []*model.WorkflowInstance {
  305. result := make([]*model.WorkflowInstance, len(instances))
  306. for i, w := range instances {
  307. result[i] = convertWorkflowInstance(w)
  308. }
  309. return result
  310. }
  311. // convertWorkflowNode converts models.WorkflowNode to model.WorkflowNode
  312. func convertWorkflowNode(n models.WorkflowNode) *model.WorkflowNode {
  313. var task *model.Task
  314. if n.Task != nil {
  315. task = convertTask(*n.Task)
  316. }
  317. var inputData *string
  318. if n.InputData != "" {
  319. inputData = &n.InputData
  320. }
  321. var outputData *string
  322. if n.OutputData != "" {
  323. outputData = &n.OutputData
  324. }
  325. var startedAt *string
  326. if n.StartedAt != nil {
  327. startedAtVal := n.StartedAt.String()
  328. startedAt = &startedAtVal
  329. }
  330. var completedAt *string
  331. if n.CompletedAt != nil {
  332. completedAtVal := n.CompletedAt.String()
  333. completedAt = &completedAtVal
  334. }
  335. return &model.WorkflowNode{
  336. ID: strconv.FormatUint(uint64(n.ID), 10),
  337. NodeKey: n.NodeKey,
  338. NodeType: n.NodeType,
  339. Status: n.Status,
  340. Task: task,
  341. InputData: inputData,
  342. OutputData: outputData,
  343. CreatedAt: n.CreatedAt.String(),
  344. UpdatedAt: n.UpdatedAt.String(),
  345. StartedAt: startedAt,
  346. CompletedAt: completedAt,
  347. }
  348. }
  349. // convertWorkflowNodes converts []models.WorkflowNode to []*model.WorkflowNode
  350. func convertWorkflowNodes(nodes []models.WorkflowNode) []*model.WorkflowNode {
  351. result := make([]*model.WorkflowNode, len(nodes))
  352. for i, n := range nodes {
  353. result[i] = convertWorkflowNode(n)
  354. }
  355. return result
  356. }