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.

176 lines
4.0 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/graph/loaders"
  9. "git.aiterp.net/stufflog/server/internal/slerrors"
  10. "git.aiterp.net/stufflog/server/models"
  11. )
  12. func (r *queryResolver) Issue(ctx context.Context, id string) (*models.Issue, error) {
  13. user := r.Auth.UserFromContext(ctx)
  14. if user == nil {
  15. return nil, slerrors.PermissionDenied
  16. }
  17. issue, err := loaders.IssueLoaderFromContext(ctx).Load(id)
  18. if err != nil {
  19. return nil, err
  20. }
  21. _, err = r.Auth.IssuePermission(ctx, *issue)
  22. if err != nil {
  23. return nil, err
  24. }
  25. return issue, nil
  26. }
  27. func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter) ([]*models.Issue, error) {
  28. user := r.Auth.UserFromContext(ctx)
  29. if user == nil {
  30. return nil, slerrors.PermissionDenied
  31. }
  32. if filter == nil {
  33. filter = &models.IssueFilter{}
  34. }
  35. issues, err := r.Database.Issues().List(ctx, *filter)
  36. if err != nil {
  37. return nil, err
  38. }
  39. loader := loaders.IssueLoaderFromContext(ctx)
  40. for _, issue := range issues {
  41. loader.Prime(issue.ID, issue)
  42. }
  43. deleteList := make([]int, 0, len(issues))
  44. for i, issue := range issues {
  45. _, err := r.Auth.IssuePermission(ctx, *issue)
  46. if err != nil {
  47. deleteList = append(deleteList, i-len(deleteList))
  48. }
  49. }
  50. for _, index := range deleteList {
  51. issues = append(issues[:index], issues[index+1:]...)
  52. }
  53. return issues, nil
  54. }
  55. func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project, error) {
  56. user := r.Auth.UserFromContext(ctx)
  57. if user == nil {
  58. return nil, slerrors.PermissionDenied
  59. }
  60. project, err := r.Database.Projects().Find(ctx, id)
  61. if err != nil {
  62. return nil, err
  63. }
  64. _, err = r.Auth.ProjectPermission(ctx, project.ID)
  65. if err != nil {
  66. return nil, err
  67. }
  68. return project, nil
  69. }
  70. func (r *queryResolver) Projects(ctx context.Context, filter *models.ProjectFilter) ([]*models.Project, error) {
  71. user := r.Auth.UserFromContext(ctx)
  72. if user == nil {
  73. return nil, slerrors.PermissionDenied
  74. }
  75. skipCheck := false
  76. if filter == nil {
  77. filter = &models.ProjectFilter{}
  78. }
  79. if filter.Permission == nil {
  80. skipCheck = true
  81. filter.Permission = &models.ProjectFilterPermission{
  82. UserID: user.ID,
  83. MinLevel: models.ProjectPermissionLevelObserver,
  84. }
  85. }
  86. projects, err := r.Database.Projects().List(ctx, *filter)
  87. if err != nil {
  88. return nil, err
  89. }
  90. if !skipCheck && len(projects) > 0 {
  91. deleteList := make([]int, 0, 4)
  92. for i, project := range projects {
  93. if _, err := r.Auth.ProjectPermission(ctx, project.ID); err != nil {
  94. deleteList = append(deleteList, i-len(deleteList))
  95. }
  96. }
  97. for _, di := range deleteList {
  98. projects = append(projects[:di], projects[di:]...)
  99. }
  100. }
  101. return projects, nil
  102. }
  103. func (r *queryResolver) Log(ctx context.Context, id string) (*models.Log, error) {
  104. user := r.Auth.UserFromContext(ctx)
  105. if user == nil {
  106. return nil, slerrors.PermissionDenied
  107. }
  108. log, err := r.Database.Logs().Find(ctx, id)
  109. if err != nil {
  110. return nil, err
  111. }
  112. r.Auth.FilterLog(ctx, log)
  113. if log.Empty() {
  114. return nil, slerrors.NotFound("Log")
  115. }
  116. return log, nil
  117. }
  118. func (r *queryResolver) Logs(ctx context.Context, filter *models.LogFilter) ([]*models.Log, error) {
  119. user := r.Auth.UserFromContext(ctx)
  120. if user == nil {
  121. return nil, slerrors.PermissionDenied
  122. }
  123. if filter == nil {
  124. filter = &models.LogFilter{
  125. UserIDs: []string{user.ID},
  126. }
  127. }
  128. logs, err := r.Database.Logs().List(ctx, *filter)
  129. if err != nil {
  130. return nil, err
  131. }
  132. r.Auth.FilterLogList(ctx, &logs)
  133. return logs, nil
  134. }
  135. func (r *queryResolver) Session(ctx context.Context) (*models.User, error) {
  136. user := r.Auth.UserFromContext(ctx)
  137. if user == nil {
  138. return nil, errors.New("not logged in")
  139. }
  140. return user, nil
  141. }
  142. // Query returns graphcore.QueryResolver implementation.
  143. func (r *Resolver) Query() graphcore.QueryResolver { return &queryResolver{r} }
  144. type queryResolver struct{ *Resolver }