Files
Trackeep/backend/models/integration.go
T
Tomas Dvorak d27cf14110 first test
2026-02-08 14:14:55 +01:00

294 lines
9.7 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
// IntegrationType represents the type of integration
type IntegrationType string
const (
IntegrationSlack IntegrationType = "slack"
IntegrationDiscord IntegrationType = "discord"
IntegrationNotion IntegrationType = "notion"
IntegrationPocket IntegrationType = "pocket"
IntegrationTodoist IntegrationType = "todoist"
IntegrationGoogle IntegrationType = "google"
IntegrationGitHub IntegrationType = "github"
IntegrationTwitter IntegrationType = "twitter"
IntegrationReddit IntegrationType = "reddit"
IntegrationObsidian IntegrationType = "obsidian"
)
// IntegrationStatus represents the status of an integration
type IntegrationStatus string
const (
StatusActive IntegrationStatus = "active"
StatusInactive IntegrationStatus = "inactive"
StatusError IntegrationStatus = "error"
StatusPending IntegrationStatus = "pending"
)
// Integration represents a third-party service integration
type Integration struct {
ID string `json:"id" gorm:"primaryKey;type:uuid;default:gen_random_uuid()"`
UserID string `json:"userId" gorm:"not null;index;type:uuid"`
Type IntegrationType `json:"type" gorm:"not null;index"`
Status IntegrationStatus `json:"status" gorm:"not null;default:'pending'"`
Name string `json:"name" gorm:"not null"`
Description string `json:"description"`
// Configuration stored as JSON
Config IntegrationConfig `json:"config" gorm:"type:jsonb"`
// Authentication tokens (encrypted)
AccessToken string `json:"-" gorm:"type:text"` // Encrypted
RefreshToken string `json:"-" gorm:"type:text"` // Encrypted
// Sync settings
SyncEnabled bool `json:"syncEnabled" gorm:"default:true"`
LastSyncAt *time.Time `json:"lastSyncAt"`
SyncInterval int `json:"syncInterval"` // in minutes, 0 = manual
// Webhook settings
WebhookURL string `json:"webhookUrl" gorm:"type:text"`
WebhookSecret string `json:"-" gorm:"type:text"` // Encrypted
// Statistics
SyncCount int `json:"syncCount" gorm:"default:0"`
ErrorCount int `json:"errorCount" gorm:"default:0"`
LastError string `json:"lastError" gorm:"type:text"`
// Timestamps
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Relationships
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
SyncLogs []SyncLog `json:"syncLogs,omitempty" gorm:"foreignKey:IntegrationID"`
}
// IntegrationConfig holds configuration specific to each integration type
type IntegrationConfig struct {
// Slack configuration
SlackConfig *SlackConfig `json:"slackConfig,omitempty"`
// Discord configuration
DiscordConfig *DiscordConfig `json:"discordConfig,omitempty"`
// Notion configuration
NotionConfig *NotionConfig `json:"notionConfig,omitempty"`
// Google configuration
GoogleConfig *GoogleConfig `json:"googleConfig,omitempty"`
// Pocket configuration
PocketConfig *PocketConfig `json:"pocketConfig,omitempty"`
// Todoist configuration
TodoistConfig *TodoistConfig `json:"todoistConfig,omitempty"`
// GitHub configuration
GitHubConfig *GitHubConfig `json:"gitHubConfig,omitempty"`
// Twitter configuration
TwitterConfig *TwitterConfig `json:"twitterConfig,omitempty"`
// Reddit configuration
RedditConfig *RedditConfig `json:"redditConfig,omitempty"`
// Obsidian configuration
ObsidianConfig *ObsidianConfig `json:"obsidianConfig,omitempty"`
}
// SlackConfig holds Slack-specific configuration
type SlackConfig struct {
TeamID string `json:"teamId"`
TeamName string `json:"teamName"`
ChannelID string `json:"channelId"`
ChannelName string `json:"channelName"`
BotUserID string `json:"botUserId"`
Scopes []string `json:"scopes"`
// Notification settings
NotifyTasks bool `json:"notifyTasks"`
NotifyBookmarks bool `json:"notifyBookmarks"`
NotifyNotes bool `json:"notifyNotes"`
NotifyDeadlines bool `json:"notifyDeadlines"`
NotifyTimeEntries bool `json:"notifyTimeEntries"`
}
// DiscordConfig holds Discord-specific configuration
type DiscordConfig struct {
GuildID string `json:"guildId"`
GuildName string `json:"guildName"`
ChannelID string `json:"channelId"`
ChannelName string `json:"channelName"`
BotUserID string `json:"botUserId"`
Scopes []string `json:"scopes"`
// Notification settings
NotifyTasks bool `json:"notifyTasks"`
NotifyBookmarks bool `json:"notifyBookmarks"`
NotifyNotes bool `json:"notifyNotes"`
NotifyDeadlines bool `json:"notifyDeadlines"`
NotifyTimeEntries bool `json:"notifyTimeEntries"`
}
// NotionConfig holds Notion-specific configuration
type NotionConfig struct {
DatabaseID string `json:"databaseId"`
WorkspaceID string `json:"workspaceId"`
WorkspaceName string `json:"workspaceName"`
// Sync settings
SyncBookmarks bool `json:"syncBookmarks"`
SyncTasks bool `json:"syncTasks"`
SyncNotes bool `json:"syncNotes"`
SyncFiles bool `json:"syncFiles"`
// Mapping settings
BookmarkDatabaseID string `json:"bookmarkDatabaseId"`
TaskDatabaseID string `json:"taskDatabaseId"`
NoteDatabaseID string `json:"noteDatabaseId"`
FileDatabaseID string `json:"fileDatabaseId"`
}
// GoogleConfig holds Google-specific configuration
type GoogleConfig struct {
// Google Drive
DriveEnabled bool `json:"driveEnabled"`
DriveFolderID string `json:"driveFolderId"`
// Google Calendar
CalendarEnabled bool `json:"calendarEnabled"`
CalendarIDs []string `json:"calendarIds"`
// Google Docs
DocsEnabled bool `json:"docsEnabled"`
// Sync settings
SyncBookmarks bool `json:"syncBookmarks"`
SyncTasks bool `json:"syncTasks"`
SyncNotes bool `json:"syncNotes"`
SyncFiles bool `json:"syncFiles"`
SyncCalendar bool `json:"syncCalendar"`
}
// PocketConfig holds Pocket-specific configuration
type PocketConfig struct {
Username string `json:"username"`
// Sync settings
SyncBookmarks bool `json:"syncBookmarks"`
SyncTags bool `json:"syncTags"`
ImportAll bool `json:"importAll"`
}
// TodoistConfig holds Todoist-specific configuration
type TodoistConfig struct {
ProjectID string `json:"projectId"`
ProjectName string `json:"projectName"`
// Sync settings
SyncTasks bool `json:"syncTasks"`
SyncProjects bool `json:"syncProjects"`
SyncLabels bool `json:"syncLabels"`
ImportAll bool `json:"importAll"`
}
// GitHubConfig holds GitHub-specific configuration
type GitHubConfig struct {
Username string `json:"username"`
RepoSync bool `json:"repoSync"`
IssueSync bool `json:"issueSync"`
PRSync bool `json:"prSync"`
StarSync bool `json:"starSync"`
WatchSync bool `json:"watchSync"`
}
// TwitterConfig holds Twitter-specific configuration
type TwitterConfig struct {
Username string `json:"username"`
SyncTweets bool `json:"syncTweets"`
SyncLikes bool `json:"syncLikes"`
SyncBookmarks bool `json:"syncBookmarks"`
}
// RedditConfig holds Reddit-specific configuration
type RedditConfig struct {
Username string `json:"username"`
SyncPosts bool `json:"syncPosts"`
SyncComments bool `json:"syncComments"`
SyncSaved bool `json:"syncSaved"`
SyncUpvoted bool `json:"syncUpvoted"`
}
// ObsidianConfig holds Obsidian-specific configuration
type ObsidianConfig struct {
VaultPath string `json:"vaultPath"`
VaultName string `json:"vaultName"`
SyncNotes bool `json:"syncNotes"`
SyncBookmarks bool `json:"syncBookmarks"`
SyncTasks bool `json:"syncTasks"`
AutoSync bool `json:"autoSync"`
}
// SyncLog represents a sync operation log
type SyncLog struct {
ID string `json:"id" gorm:"primaryKey;type:uuid;default:gen_random_uuid()"`
IntegrationID string `json:"integrationId" gorm:"not null;index;type:uuid"`
Type string `json:"type"` // "full", "incremental", "manual", "webhook"
Status string `json:"status"` // "success", "error", "partial"
// Sync statistics
ItemsProcessed int `json:"itemsProcessed"`
ItemsCreated int `json:"itemsCreated"`
ItemsUpdated int `json:"itemsUpdated"`
ItemsDeleted int `json:"itemsDeleted"`
ItemsSkipped int `json:"itemsSkipped"`
// Timing
StartedAt time.Time `json:"startedAt"`
CompletedAt *time.Time `json:"completedAt"`
Duration int `json:"duration"` // in seconds
// Error details
ErrorMessage string `json:"errorMessage" gorm:"type:text"`
ErrorDetails string `json:"errorDetails" gorm:"type:text"`
// Additional data
SyncData string `json:"syncData" gorm:"type:jsonb"`
// Timestamps
CreatedAt time.Time `json:"createdAt"`
// Relationships
Integration Integration `json:"integration,omitempty" gorm:"foreignKey:IntegrationID"`
}
// WebhookEvent represents an incoming webhook event
type WebhookEvent struct {
ID string `json:"id" gorm:"primaryKey;type:uuid;default:gen_random_uuid()"`
IntegrationID string `json:"integrationId" gorm:"not null;index;type:uuid"`
Type string `json:"type"` // "slack", "discord", etc.
EventType string `json:"eventType"` // "message", "reaction_added", etc.
// Event data
Payload string `json:"payload" gorm:"type:jsonb"`
Processed bool `json:"processed" gorm:"default:false"`
// Processing details
ProcessedAt *time.Time `json:"processedAt"`
ErrorMessage string `json:"errorMessage" gorm:"type:text"`
// Timestamps
CreatedAt time.Time `json:"createdAt"`
// Relationships
Integration Integration `json:"integration,omitempty" gorm:"foreignKey:IntegrationID"`
}