71 lines
2.0 KiB
Go
71 lines
2.0 KiB
Go
//go:generate sh ../scripts/genSchema.sh
|
|
//go:generate go run github.com/99designs/gqlgen
|
|
|
|
package graph
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
"github.com/google/uuid"
|
|
"github.com/jordanknott/taskcafe/internal/config"
|
|
"github.com/jordanknott/taskcafe/internal/db"
|
|
"github.com/jordanknott/taskcafe/internal/jobs"
|
|
"github.com/jordanknott/taskcafe/internal/utils"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// Resolver handles resolving GraphQL queries & mutations
|
|
type Resolver struct {
|
|
Repository db.Repository
|
|
AppConfig config.AppConfig
|
|
Notifications *NotificationObservers
|
|
Job jobs.JobQueue
|
|
Redis *redis.Client
|
|
}
|
|
|
|
func (r Resolver) SubscribeRedis() {
|
|
ctx := context.Background()
|
|
go func() {
|
|
subscriber := r.Redis.Subscribe(ctx, "notification-created")
|
|
log.Info("Stream starting...")
|
|
for {
|
|
|
|
msg, err := subscriber.ReceiveMessage(ctx)
|
|
if err != nil {
|
|
log.WithError(err).Error("while receiving message")
|
|
panic(err)
|
|
}
|
|
var message utils.NotificationCreatedMessage
|
|
|
|
if err := json.Unmarshal([]byte(msg.Payload), &message); err != nil {
|
|
log.WithError(err).Error("while unmarshalling notifiction created message")
|
|
panic(err)
|
|
}
|
|
log.WithField("notID", message.NotifiedID).Info("received notification message")
|
|
|
|
notified, err := r.Repository.GetNotifiedByIDNoExtra(ctx, uuid.MustParse(message.NotifiedID))
|
|
if err != nil {
|
|
log.WithError(err).Error("while getting notified by id")
|
|
panic(err)
|
|
}
|
|
notification, err := r.Repository.GetNotificationByID(ctx, uuid.MustParse(message.NotificationID))
|
|
if err != nil {
|
|
log.WithError(err).Error("while getting notified by id")
|
|
panic(err)
|
|
}
|
|
for _, observers := range r.Notifications.Subscribers {
|
|
for _, ochan := range observers {
|
|
ochan <- &Notified{
|
|
ID: notified.NotifiedID,
|
|
Read: notified.Read,
|
|
ReadAt: ¬ified.ReadAt.Time,
|
|
Notification: ¬ification,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
}
|