stufflog graphql server
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
6.2 KiB

4 years ago
  1. package resolvers
  2. // This file will be automatically regenerated based on the schema, any resolver implementations
  3. // will be copied through when generating and any unknown code will be moved to the end.
  4. import (
  5. "context"
  6. "errors"
  7. "git.aiterp.net/stufflog/server/graph/graphcore"
  8. "git.aiterp.net/stufflog/server/internal/slerrors"
  9. "git.aiterp.net/stufflog/server/models"
  10. )
  11. func (r *queryResolver) Issue(ctx context.Context, id string) (*models.Issue, error) {
  12. user := r.Auth.UserFromContext(ctx)
  13. if user == nil {
  14. return nil, slerrors.PermissionDenied
  15. }
  16. issue, err := r.Database.Issues().Find(ctx, id)
  17. if err != nil {
  18. return nil, err
  19. }
  20. _, err = r.Auth.IssuePermission(ctx, *issue)
  21. if err != nil {
  22. return nil, err
  23. }
  24. return issue, nil
  25. }
  26. func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter) ([]*models.Issue, error) {
  27. user := r.Auth.UserFromContext(ctx)
  28. if user == nil {
  29. return nil, slerrors.PermissionDenied
  30. }
  31. if filter == nil {
  32. filter = &models.IssueFilter{}
  33. }
  34. issues, err := r.Database.Issues().List(ctx, *filter)
  35. if err != nil {
  36. return nil, err
  37. }
  38. deleteList := make([]int, 0, len(issues))
  39. for i, issue := range issues {
  40. _, err := r.Auth.IssuePermission(ctx, *issue)
  41. if err != nil {
  42. deleteList = append(deleteList, i-len(deleteList))
  43. }
  44. }
  45. for _, index := range deleteList {
  46. issues = append(issues[:index], issues[index+1:]...)
  47. }
  48. return issues, nil
  49. }
  50. func (r *queryResolver) Item(ctx context.Context, id string) (*models.Item, error) {
  51. user := r.Auth.UserFromContext(ctx)
  52. if user == nil {
  53. return nil, slerrors.PermissionDenied
  54. }
  55. return r.Database.Items().Find(ctx, id)
  56. }
  57. func (r *queryResolver) Items(ctx context.Context, filter *models.ItemFilter) ([]*models.Item, error) {
  58. user := r.Auth.UserFromContext(ctx)
  59. if user == nil {
  60. return nil, slerrors.PermissionDenied
  61. }
  62. if filter == nil {
  63. filter = &models.ItemFilter{}
  64. }
  65. return r.Database.Items().List(ctx, *filter)
  66. }
  67. func (r *queryResolver) ItemTags(ctx context.Context) ([]string, error) {
  68. user := r.Auth.UserFromContext(ctx)
  69. if user == nil {
  70. return nil, slerrors.PermissionDenied
  71. }
  72. return r.Database.Items().GetTags(ctx)
  73. }
  74. func (r *queryResolver) IssueItem(ctx context.Context, id string) (*models.IssueItem, error) {
  75. user := r.Auth.UserFromContext(ctx)
  76. if user == nil {
  77. return nil, slerrors.PermissionDenied
  78. }
  79. item, err := r.Database.IssueItems().Find(ctx, id)
  80. if err != nil {
  81. return nil, err
  82. }
  83. issue, err := r.Database.Issues().Find(ctx, item.IssueID)
  84. if err != nil {
  85. return nil, err
  86. }
  87. _, err = r.Auth.IssuePermission(ctx, *issue)
  88. if err != nil {
  89. return nil, err
  90. }
  91. return item, nil
  92. }
  93. func (r *queryResolver) IssueItems(ctx context.Context, filter *models.IssueItemFilter) ([]*models.IssueItem, error) {
  94. user := r.Auth.UserFromContext(ctx)
  95. if user == nil {
  96. return nil, slerrors.PermissionDenied
  97. }
  98. if filter == nil {
  99. filter = &models.IssueItemFilter{}
  100. }
  101. items, err := r.Database.IssueItems().List(ctx, *filter)
  102. if err != nil {
  103. return nil, err
  104. }
  105. accessMap := make(map[string]bool)
  106. deleteList := make([]int, 0, len(items))
  107. for i, item := range items {
  108. if access, ok := accessMap[item.IssueID]; ok && access {
  109. continue
  110. } else if ok && !access {
  111. deleteList = append(deleteList, i-len(deleteList))
  112. continue
  113. }
  114. issue, err := r.Database.Issues().Find(ctx, item.IssueID)
  115. if err != nil {
  116. deleteList = append(deleteList, i-len(deleteList))
  117. accessMap[item.IssueID] = true
  118. continue
  119. }
  120. _, err = r.Auth.IssuePermission(ctx, *issue)
  121. if err != nil {
  122. deleteList = append(deleteList, i-len(deleteList))
  123. }
  124. accessMap[issue.ID] = err != nil
  125. }
  126. for _, index := range deleteList {
  127. items = append(items[:index], items[index+1:]...)
  128. }
  129. return items, nil
  130. }
  131. func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project, error) {
  132. user := r.Auth.UserFromContext(ctx)
  133. if user == nil {
  134. return nil, slerrors.PermissionDenied
  135. }
  136. project, err := r.Database.Projects().Find(ctx, id)
  137. if err != nil {
  138. return nil, err
  139. }
  140. _, err = r.Auth.ProjectPermission(ctx, *project)
  141. if err != nil {
  142. return nil, err
  143. }
  144. return project, nil
  145. }
  146. func (r *queryResolver) Projects(ctx context.Context, filter *models.ProjectFilter) ([]*models.Project, error) {
  147. user := r.Auth.UserFromContext(ctx)
  148. if user == nil {
  149. return nil, slerrors.PermissionDenied
  150. }
  151. skipCheck := false
  152. if filter == nil {
  153. filter = &models.ProjectFilter{}
  154. }
  155. if filter.Permission == nil {
  156. skipCheck = true
  157. filter.Permission = &models.ProjectFilterPermission{
  158. UserID: user.ID,
  159. MinLevel: models.ProjectPermissionLevelObserver,
  160. }
  161. }
  162. projects, err := r.Database.Projects().List(ctx, *filter)
  163. if err != nil {
  164. return nil, err
  165. }
  166. if !skipCheck && len(projects) > 0 {
  167. deleteList := make([]int, 0, 4)
  168. for i, project := range projects {
  169. if _, err := r.Auth.ProjectPermission(ctx, *project); err != nil {
  170. deleteList = append(deleteList, i-len(deleteList))
  171. }
  172. }
  173. for _, di := range deleteList {
  174. projects = append(projects[:di], projects[di:]...)
  175. }
  176. }
  177. return projects, nil
  178. }
  179. func (r *queryResolver) Log(ctx context.Context, id string) (*models.Log, error) {
  180. user := r.Auth.UserFromContext(ctx)
  181. if user == nil {
  182. return nil, slerrors.PermissionDenied
  183. }
  184. log, err := r.Database.Logs().Find(ctx, id)
  185. if err != nil {
  186. return nil, err
  187. }
  188. r.Auth.FilterLog(ctx, log)
  189. if log.Empty() {
  190. return nil, slerrors.NotFound("Log")
  191. }
  192. return log, nil
  193. }
  194. func (r *queryResolver) Logs(ctx context.Context, filter *models.LogFilter) ([]*models.Log, error) {
  195. user := r.Auth.UserFromContext(ctx)
  196. if user == nil {
  197. return nil, slerrors.PermissionDenied
  198. }
  199. if filter == nil {
  200. filter = &models.LogFilter{
  201. UserIDs: []string{user.ID},
  202. }
  203. }
  204. logs, err := r.Database.Logs().List(ctx, *filter)
  205. if err != nil {
  206. return nil, err
  207. }
  208. r.Auth.FilterLogList(ctx, &logs)
  209. return logs, nil
  210. }
  211. func (r *queryResolver) Session(ctx context.Context) (*models.User, error) {
  212. user := r.Auth.UserFromContext(ctx)
  213. if user == nil {
  214. return nil, errors.New("not logged in")
  215. }
  216. return user, nil
  217. }
  218. // Query returns graphcore.QueryResolver implementation.
  219. func (r *Resolver) Query() graphcore.QueryResolver { return &queryResolver{r} }
  220. type queryResolver struct{ *Resolver }