mirror of
https://github.com/Dvorinka/Productier.git
synced 2026-06-04 12:33:01 +00:00
133 lines
4.3 KiB
Go
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
|
|
} |