Files
Tomas Dvorak d27cf14110 first test
2026-02-08 14:14:55 +01:00

191 lines
7.7 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
// Team represents a collaborative workspace
type Team struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
Name string `json:"name" gorm:"not null"`
Description string `json:"description"`
Avatar string `json:"avatar"`
IsPublic bool `json:"is_public" gorm:"default:false"`
IsActive bool `json:"is_active" gorm:"default:true"`
// Owner of the team
OwnerID uint `json:"owner_id" gorm:"not null;index"`
Owner User `json:"owner,omitempty" gorm:"foreignKey:OwnerID"`
// Team members and relationships
Members []TeamMember `json:"members,omitempty" gorm:"foreignKey:TeamID"`
Invitations []TeamInvitation `json:"invitations,omitempty" gorm:"foreignKey:TeamID"`
Projects []TeamProject `json:"projects,omitempty" gorm:"foreignKey:TeamID"`
Bookmarks []TeamBookmark `json:"bookmarks,omitempty" gorm:"foreignKey:TeamID"`
Notes []TeamNote `json:"notes,omitempty" gorm:"foreignKey:TeamID"`
Tasks []TeamTask `json:"tasks,omitempty" gorm:"foreignKey:TeamID"`
Files []TeamFile `json:"files,omitempty" gorm:"foreignKey:TeamID"`
}
// TeamMember represents a user's membership in a team
type TeamMember struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
Role string `json:"role" gorm:"default:member"` // owner, admin, member, viewer
JoinedAt time.Time `json:"joined_at"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
}
// TeamInvitation represents an invitation to join a team
type TeamInvitation struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
Email string `json:"email" gorm:"not null"` // Email for non-registered users
Role string `json:"role" gorm:"default:member"`
Token string `json:"token" gorm:"uniqueIndex;not null"` // Invitation token
Status string `json:"status" gorm:"default:pending"` // pending, accepted, declined, expired
ExpiresAt time.Time `json:"expires_at"`
InvitedBy uint `json:"invited_by" gorm:"not null"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Inviter User `json:"inviter,omitempty" gorm:"foreignKey:InvitedBy"`
}
// TeamProject represents a project within a team
type TeamProject struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
Name string `json:"name" gorm:"not null"`
Description string `json:"description"`
Status string `json:"status" gorm:"default:active"` // active, archived, completed
RepositoryURL string `json:"repository_url"`
LiveURL string `json:"live_url"`
Tags []TeamProjectTag `json:"tags,omitempty" gorm:"foreignKey:ProjectID"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
}
// TeamProjectTag represents tags for team projects
type TeamProjectTag struct {
ID uint `json:"id" gorm:"primaryKey"`
ProjectID uint `json:"project_id" gorm:"not null;index"`
Tag string `json:"tag" gorm:"not null"`
}
// TeamBookmark represents a bookmark shared within a team
type TeamBookmark struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
BookmarkID uint `json:"bookmark_id" gorm:"not null;index"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Bookmark Bookmark `json:"bookmark,omitempty" gorm:"foreignKey:BookmarkID"`
}
// TeamNote represents a note shared within a team
type TeamNote struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
NoteID uint `json:"note_id" gorm:"not null;index"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Note Note `json:"note,omitempty" gorm:"foreignKey:NoteID"`
}
// TeamTask represents a task within a team
type TeamTask struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
TaskID uint `json:"task_id" gorm:"not null;index"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Task Task `json:"task,omitempty" gorm:"foreignKey:TaskID"`
}
// TeamFile represents a file shared within a team
type TeamFile struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
FileID uint `json:"file_id" gorm:"not null;index"`
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
File File `json:"file,omitempty" gorm:"foreignKey:FileID"`
}
// TeamActivity represents activity logs for team actions
type TeamActivity struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
TeamID uint `json:"team_id" gorm:"not null;index"`
UserID uint `json:"user_id" gorm:"not null;index"`
Action string `json:"action" gorm:"not null"` // created, updated, deleted, joined, left, etc.
EntityType string `json:"entity_type" gorm:"not null"` // team, project, bookmark, note, task, file
EntityID uint `json:"entity_id" gorm:"not null"`
Details string `json:"details"` // JSON string with additional details
Team Team `json:"team,omitempty" gorm:"foreignKey:TeamID"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
}
// TeamStats represents aggregated team statistics
type TeamStats struct {
TeamID uint `json:"team_id"`
MembersCount int64 `json:"members_count"`
ProjectsCount int64 `json:"projects_count"`
BookmarksCount int64 `json:"bookmarks_count"`
NotesCount int64 `json:"notes_count"`
TasksCount int64 `json:"tasks_count"`
FilesCount int64 `json:"files_count"`
RecentActivity int64 `json:"recent_activity"` // Activity in last 7 days
}