Files
Tomas Dvorak 3cb40adb23 first commit
2026-04-10 12:04:09 +02:00

133 lines
4.3 KiB
Go

package store
import (
"time"
"github.com/google/uuid"
)
// CreateNotificationForTaskAssignment creates a notification when a task is assigned
func (s *PostgresStore) CreateNotificationForTaskAssignment(workspaceSlug, assigneeEmail, taskTitle, taskID string) {
s.CreateNotification(CreateNotificationInput{
WorkspaceSlug: workspaceSlug,
UserEmail: assigneeEmail,
Type: "task_assigned",
Title: "Task assigned to you",
Body: "You have been assigned to: " + taskTitle,
EntityType: strPtr("task"),
EntityID: strPtr(taskID),
})
}
// CreateNotificationForMention creates a notification when a user is mentioned
func (s *PostgresStore) CreateNotificationForMention(workspaceSlug, mentionedEmail, mentionerName, entityType, entityID, context string) {
s.CreateNotification(CreateNotificationInput{
WorkspaceSlug: workspaceSlug,
UserEmail: mentionedEmail,
Type: "mention",
Title: mentionerName + " mentioned you",
Body: context,
EntityType: strPtr(entityType),
EntityID: strPtr(entityID),
})
}
// CreateNotificationForComment creates a notification for a new comment on an entity
func (s *PostgresStore) CreateNotificationForComment(workspaceSlug, ownerEmail, commenterName, entityType, entityID, entityTitle string) {
s.CreateNotification(CreateNotificationInput{
WorkspaceSlug: workspaceSlug,
UserEmail: ownerEmail,
Type: "comment",
Title: commenterName + " commented on " + entityTitle,
Body: "New comment on " + entityType,
EntityType: strPtr(entityType),
EntityID: strPtr(entityID),
})
}
// CreateNotificationForTaskCompletion creates a notification when a task is completed
func (s *PostgresStore) CreateNotificationForTaskCompletion(workspaceSlug, assignerEmail, taskTitle, taskID string) {
s.CreateNotification(CreateNotificationInput{
WorkspaceSlug: workspaceSlug,
UserEmail: assignerEmail,
Type: "task_completed",
Title: "Task completed: " + taskTitle,
Body: "A task you assigned has been completed",
EntityType: strPtr("task"),
EntityID: strPtr(taskID),
})
}
// CreateNotificationForEventReminder creates a notification for an upcoming event
func (s *PostgresStore) CreateNotificationForEventReminder(workspaceSlug, userEmail, eventTitle, eventID string) {
s.CreateNotification(CreateNotificationInput{
WorkspaceSlug: workspaceSlug,
UserEmail: userEmail,
Type: "event_reminder",
Title: "Upcoming event: " + eventTitle,
Body: "Your event is starting soon",
EntityType: strPtr("event"),
EntityID: strPtr(eventID),
})
}
// TriggerWebhooks triggers all webhooks for a given event type
func (s *PostgresStore) TriggerWebhooks(workspaceSlug, eventType string, payload map[string]interface{}) {
// Get all active webhooks for this workspace
rows, err := s.db.Query(`
SELECT id, url, secret, events
FROM webhooks
WHERE workspace_slug = $1 AND active = true
`, workspaceSlug)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
var id, url, secret, eventsJSON string
if err := rows.Scan(&id, &url, &secret, &eventsJSON); err != nil {
continue
}
// Check if this webhook subscribes to the event
// Simple string contains check for the event type in the JSON array
if !containsEvent(eventsJSON, eventType) {
continue
}
// Update last triggered timestamp
s.db.Exec(`UPDATE webhooks SET last_triggered_at = $1 WHERE id = $2`, time.Now().UTC(), id)
// Webhook delivery would happen here in a goroutine
// For now, we just mark it as triggered
go deliverWebhook(url, secret, eventType, payload)
}
}
func strPtr(s string) *string {
return &s
}
func containsEvent(eventsJSON, eventType string) bool {
// Simple check - in production would parse JSON properly
return len(eventsJSON) > 2 &&
(eventsJSON == "[]" ||
eventsJSON == "[\""+eventType+"\"]" ||
containsSubstring(eventsJSON, "\""+eventType+"\""))
}
func containsSubstring(s, substr string) bool {
for i := 0; i <= len(s)-len(substr); i++ {
if s[i:i+len(substr)] == substr {
return true
}
}
return false
}
func deliverWebhook(url, secret, eventType string, payload map[string]interface{}) {
// Webhook delivery implementation
// In production, this would make an HTTP POST request
// with proper signature using the secret
}