1
0

resolver.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package graph
  2. import (
  3. "sync"
  4. "gogs.dmsc.dev/arp/graph/model"
  5. "gorm.io/gorm"
  6. )
  7. // This file will not be regenerated automatically.
  8. //
  9. // It serves as dependency injection for your app, add any dependencies you require
  10. // here.
  11. // TaskEvent represents a task event for subscriptions
  12. type TaskEvent struct {
  13. Task *model.Task
  14. UserID uint // The user who should receive this event (assignee)
  15. EventType string // "created", "updated", "deleted"
  16. }
  17. // MessageEvent represents a message event for subscriptions
  18. type MessageEvent struct {
  19. Message *model.Message
  20. ReceiverIDs []uint // IDs of users who should receive this event
  21. }
  22. // Resolver is the main resolver struct
  23. type Resolver struct {
  24. DB *gorm.DB
  25. // Pub/Sub channels for subscriptions
  26. taskSubscribers map[uint]chan TaskEvent // keyed by user ID
  27. taskSubscribersMu sync.RWMutex
  28. messageSubscribers map[uint]chan MessageEvent // keyed by user ID
  29. messageSubscribersMu sync.RWMutex
  30. }
  31. // NewResolver creates a new resolver with initialized pub/sub
  32. func NewResolver(db *gorm.DB) *Resolver {
  33. return &Resolver{
  34. DB: db,
  35. taskSubscribers: make(map[uint]chan TaskEvent),
  36. messageSubscribers: make(map[uint]chan MessageEvent),
  37. }
  38. }
  39. // SubscribeToTasks registers a user for task events and returns their event channel
  40. func (r *Resolver) SubscribeToTasks(userID uint) <-chan TaskEvent {
  41. r.taskSubscribersMu.Lock()
  42. defer r.taskSubscribersMu.Unlock()
  43. ch := make(chan TaskEvent, 10)
  44. r.taskSubscribers[userID] = ch
  45. return ch
  46. }
  47. // PublishTaskEvent sends a task event to the assignee
  48. func (r *Resolver) PublishTaskEvent(task *model.Task, assigneeID *uint, eventType string) {
  49. if assigneeID == nil {
  50. return // No assignee, no one to notify
  51. }
  52. event := TaskEvent{
  53. Task: task,
  54. UserID: *assigneeID,
  55. EventType: eventType,
  56. }
  57. r.taskSubscribersMu.RLock()
  58. defer r.taskSubscribersMu.RUnlock()
  59. if ch, ok := r.taskSubscribers[event.UserID]; ok {
  60. select {
  61. case ch <- event:
  62. default:
  63. // Channel full, skip event
  64. }
  65. }
  66. }
  67. // SubscribeToMessages registers a user for message events and returns their event channel
  68. func (r *Resolver) SubscribeToMessages(userID uint) <-chan MessageEvent {
  69. r.messageSubscribersMu.Lock()
  70. defer r.messageSubscribersMu.Unlock()
  71. ch := make(chan MessageEvent, 10)
  72. r.messageSubscribers[userID] = ch
  73. return ch
  74. }
  75. // PublishMessageEvent sends a message event to all receivers
  76. func (r *Resolver) PublishMessageEvent(message *model.Message, receiverIDs []uint) {
  77. event := MessageEvent{
  78. Message: message,
  79. ReceiverIDs: receiverIDs,
  80. }
  81. r.messageSubscribersMu.RLock()
  82. defer r.messageSubscribersMu.RUnlock()
  83. for _, userID := range receiverIDs {
  84. if ch, ok := r.messageSubscribers[userID]; ok {
  85. select {
  86. case ch <- event:
  87. default:
  88. // Channel full, skip event
  89. }
  90. }
  91. }
  92. }