resolver.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. ChannelID uint
  21. ParticipantIDs []uint // IDs of users who should receive this event
  22. }
  23. // Resolver is the main resolver struct
  24. type Resolver struct {
  25. DB *gorm.DB
  26. // Pub/Sub channels for subscriptions
  27. taskSubscribers map[uint]chan TaskEvent // keyed by user ID
  28. taskSubscribersMu sync.RWMutex
  29. messageSubscribers map[uint]chan MessageEvent // keyed by user ID
  30. messageSubscribersMu sync.RWMutex
  31. }
  32. // NewResolver creates a new resolver with initialized pub/sub
  33. func NewResolver(db *gorm.DB) *Resolver {
  34. return &Resolver{
  35. DB: db,
  36. taskSubscribers: make(map[uint]chan TaskEvent),
  37. messageSubscribers: make(map[uint]chan MessageEvent),
  38. }
  39. }
  40. // SubscribeToTasks registers a user for task events and returns their event channel
  41. func (r *Resolver) SubscribeToTasks(userID uint) <-chan TaskEvent {
  42. r.taskSubscribersMu.Lock()
  43. defer r.taskSubscribersMu.Unlock()
  44. ch := make(chan TaskEvent, 10)
  45. r.taskSubscribers[userID] = ch
  46. return ch
  47. }
  48. // PublishTaskEvent sends a task event to the assignee
  49. func (r *Resolver) PublishTaskEvent(task *model.Task, assigneeID *uint, eventType string) {
  50. if assigneeID == nil {
  51. return // No assignee, no one to notify
  52. }
  53. event := TaskEvent{
  54. Task: task,
  55. UserID: *assigneeID,
  56. EventType: eventType,
  57. }
  58. r.taskSubscribersMu.RLock()
  59. defer r.taskSubscribersMu.RUnlock()
  60. if ch, ok := r.taskSubscribers[event.UserID]; ok {
  61. select {
  62. case ch <- event:
  63. default:
  64. // Channel full, skip event
  65. }
  66. }
  67. }
  68. // SubscribeToMessages registers a user for message events and returns their event channel
  69. func (r *Resolver) SubscribeToMessages(userID uint) <-chan MessageEvent {
  70. r.messageSubscribersMu.Lock()
  71. defer r.messageSubscribersMu.Unlock()
  72. ch := make(chan MessageEvent, 10)
  73. r.messageSubscribers[userID] = ch
  74. return ch
  75. }
  76. // PublishMessageEvent sends a message event to all channel participants
  77. func (r *Resolver) PublishMessageEvent(message *model.Message, channelID uint, participantIDs []uint) {
  78. event := MessageEvent{
  79. Message: message,
  80. ChannelID: channelID,
  81. ParticipantIDs: participantIDs,
  82. }
  83. r.messageSubscribersMu.RLock()
  84. defer r.messageSubscribersMu.RUnlock()
  85. for _, userID := range participantIDs {
  86. if ch, ok := r.messageSubscribers[userID]; ok {
  87. select {
  88. case ch <- event:
  89. default:
  90. // Channel full, skip event
  91. }
  92. }
  93. }
  94. }