mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-03 20:12:58 +00:00
191 lines
7.7 KiB
Go
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
|
|
}
|