107 lines
3.0 KiB
Go
107 lines
3.0 KiB
Go
package graph
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/jordanknott/taskcafe/internal/db"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// GetOwnedList todo: remove this
|
|
func GetOwnedList(ctx context.Context, r db.Repository, user db.UserAccount) (*OwnedList, error) {
|
|
return &OwnedList{}, nil
|
|
}
|
|
|
|
type CreateNotificationParams struct {
|
|
NotifiedList []uuid.UUID
|
|
ActionType ActionType
|
|
CausedBy uuid.UUID
|
|
Data map[string]string
|
|
}
|
|
|
|
func (r *Resolver) CreateNotification(ctx context.Context, data CreateNotificationParams) error {
|
|
now := time.Now().UTC()
|
|
raw, err := json.Marshal(NotifiedData{Data: data.Data})
|
|
if err != nil {
|
|
log.WithError(err).Error("error while marshal json data for notification")
|
|
return err
|
|
}
|
|
log.WithField("ActionType", data.ActionType).Info("creating notification object")
|
|
n, err := r.Repository.CreateNotification(ctx, db.CreateNotificationParams{
|
|
CausedBy: data.CausedBy,
|
|
ActionType: data.ActionType.String(),
|
|
CreatedOn: now,
|
|
Data: json.RawMessage(raw),
|
|
})
|
|
if err != nil {
|
|
log.WithError(err).Error("error while creating notification")
|
|
return err
|
|
}
|
|
for _, nn := range data.NotifiedList {
|
|
log.WithFields(log.Fields{"UserID": nn, "NotificationID": n.NotificationID}).Info("creating notification notified object")
|
|
notified, err := r.Repository.CreateNotificationNotifed(ctx, db.CreateNotificationNotifedParams{
|
|
UserID: nn,
|
|
NotificationID: n.NotificationID,
|
|
})
|
|
if err != nil {
|
|
log.WithError(err).Error("error while creating notification notified object")
|
|
return err
|
|
}
|
|
for ouid, observers := range r.Notifications.Subscribers {
|
|
log.WithField("ouid", ouid).Info("checking user subscribers")
|
|
for oid, ochan := range observers {
|
|
log.WithField("ouid", ouid).WithField("oid", oid).Info("checking user subscriber")
|
|
ochan <- &Notified{
|
|
ID: notified.NotifiedID,
|
|
Read: notified.Read,
|
|
ReadAt: ¬ified.ReadAt.Time,
|
|
Notification: &n,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetMemberList returns a list of projects the user is a member of
|
|
func GetMemberList(ctx context.Context, r db.Repository, user db.UserAccount) (*MemberList, error) {
|
|
projectMemberIDs, err := r.GetMemberProjectIDsForUserID(ctx, user.UserID)
|
|
if err != sql.ErrNoRows && err != nil {
|
|
return &MemberList{}, err
|
|
}
|
|
var projects []db.Project
|
|
for _, projectID := range projectMemberIDs {
|
|
project, err := r.GetProjectByID(ctx, projectID)
|
|
if err != nil {
|
|
return &MemberList{}, err
|
|
}
|
|
projects = append(projects, project)
|
|
}
|
|
teamMemberIDs, err := r.GetMemberTeamIDsForUserID(ctx, user.UserID)
|
|
if err != sql.ErrNoRows && err != nil {
|
|
return &MemberList{}, err
|
|
}
|
|
var teams []db.Team
|
|
for _, teamID := range teamMemberIDs {
|
|
team, err := r.GetTeamByID(ctx, teamID)
|
|
if err != nil {
|
|
return &MemberList{}, err
|
|
}
|
|
teams = append(teams, team)
|
|
}
|
|
|
|
return &MemberList{Teams: teams, Projects: projects}, nil
|
|
}
|
|
|
|
type ActivityData struct {
|
|
Data map[string]string
|
|
}
|
|
|
|
type NotifiedData struct {
|
|
Data map[string]string
|
|
}
|