Go handlers, models, stores and migrations for all SDK modules. Updates developer portal navigation and BYOEH page. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
165 lines
7.0 KiB
Go
165 lines
7.0 KiB
Go
package dsb
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// ============================================================================
|
|
// Core Models
|
|
// ============================================================================
|
|
|
|
// Assignment represents a DSB-to-tenant assignment.
|
|
type Assignment struct {
|
|
ID uuid.UUID `json:"id"`
|
|
DSBUserID uuid.UUID `json:"dsb_user_id"`
|
|
TenantID uuid.UUID `json:"tenant_id"`
|
|
TenantName string `json:"tenant_name"` // populated via JOIN
|
|
TenantSlug string `json:"tenant_slug"` // populated via JOIN
|
|
Status string `json:"status"` // active, paused, terminated
|
|
ContractStart time.Time `json:"contract_start"`
|
|
ContractEnd *time.Time `json:"contract_end,omitempty"`
|
|
MonthlyHoursBudget float64 `json:"monthly_hours_budget"`
|
|
Notes string `json:"notes"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// HourEntry represents a DSB time tracking entry.
|
|
type HourEntry struct {
|
|
ID uuid.UUID `json:"id"`
|
|
AssignmentID uuid.UUID `json:"assignment_id"`
|
|
Date time.Time `json:"date"`
|
|
Hours float64 `json:"hours"`
|
|
Category string `json:"category"` // dsfa_review, consultation, audit, training, incident_response, documentation, meeting, other
|
|
Description string `json:"description"`
|
|
Billable bool `json:"billable"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// Task represents a DSB task/work item.
|
|
type Task struct {
|
|
ID uuid.UUID `json:"id"`
|
|
AssignmentID uuid.UUID `json:"assignment_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Category string `json:"category"` // dsfa_review, dsr_response, incident_review, audit_preparation, policy_review, training, consultation, other
|
|
Priority string `json:"priority"` // low, medium, high, urgent
|
|
Status string `json:"status"` // open, in_progress, waiting, completed, cancelled
|
|
DueDate *time.Time `json:"due_date,omitempty"`
|
|
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// Communication represents a DSB communication log entry.
|
|
type Communication struct {
|
|
ID uuid.UUID `json:"id"`
|
|
AssignmentID uuid.UUID `json:"assignment_id"`
|
|
Direction string `json:"direction"` // inbound, outbound
|
|
Channel string `json:"channel"` // email, phone, meeting, portal, letter
|
|
Subject string `json:"subject"`
|
|
Content string `json:"content"`
|
|
Participants string `json:"participants"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Dashboard Models
|
|
// ============================================================================
|
|
|
|
// DSBDashboard provides the aggregated overview for a DSB user.
|
|
type DSBDashboard struct {
|
|
Assignments []AssignmentOverview `json:"assignments"`
|
|
TotalAssignments int `json:"total_assignments"`
|
|
ActiveAssignments int `json:"active_assignments"`
|
|
TotalHoursThisMonth float64 `json:"total_hours_this_month"`
|
|
OpenTasks int `json:"open_tasks"`
|
|
UrgentTasks int `json:"urgent_tasks"`
|
|
GeneratedAt time.Time `json:"generated_at"`
|
|
}
|
|
|
|
// AssignmentOverview enriches an Assignment with aggregated metrics.
|
|
type AssignmentOverview struct {
|
|
Assignment
|
|
ComplianceScore int `json:"compliance_score"`
|
|
HoursThisMonth float64 `json:"hours_this_month"`
|
|
HoursBudget float64 `json:"hours_budget"`
|
|
OpenTaskCount int `json:"open_task_count"`
|
|
UrgentTaskCount int `json:"urgent_task_count"`
|
|
NextDeadline *time.Time `json:"next_deadline,omitempty"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Request Models
|
|
// ============================================================================
|
|
|
|
// CreateAssignmentRequest is the request body for creating an assignment.
|
|
type CreateAssignmentRequest struct {
|
|
DSBUserID uuid.UUID `json:"dsb_user_id" binding:"required"`
|
|
TenantID uuid.UUID `json:"tenant_id" binding:"required"`
|
|
Status string `json:"status"`
|
|
ContractStart time.Time `json:"contract_start" binding:"required"`
|
|
ContractEnd *time.Time `json:"contract_end,omitempty"`
|
|
MonthlyHoursBudget float64 `json:"monthly_hours_budget"`
|
|
Notes string `json:"notes"`
|
|
}
|
|
|
|
// UpdateAssignmentRequest is the request body for updating an assignment.
|
|
type UpdateAssignmentRequest struct {
|
|
Status *string `json:"status,omitempty"`
|
|
ContractEnd *time.Time `json:"contract_end,omitempty"`
|
|
MonthlyHoursBudget *float64 `json:"monthly_hours_budget,omitempty"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
}
|
|
|
|
// CreateHourEntryRequest is the request body for creating a time entry.
|
|
type CreateHourEntryRequest struct {
|
|
Date time.Time `json:"date" binding:"required"`
|
|
Hours float64 `json:"hours" binding:"required"`
|
|
Category string `json:"category" binding:"required"`
|
|
Description string `json:"description" binding:"required"`
|
|
Billable *bool `json:"billable,omitempty"`
|
|
}
|
|
|
|
// CreateTaskRequest is the request body for creating a task.
|
|
type CreateTaskRequest struct {
|
|
Title string `json:"title" binding:"required"`
|
|
Description string `json:"description"`
|
|
Category string `json:"category" binding:"required"`
|
|
Priority string `json:"priority"`
|
|
DueDate *time.Time `json:"due_date,omitempty"`
|
|
}
|
|
|
|
// UpdateTaskRequest is the request body for updating a task.
|
|
type UpdateTaskRequest struct {
|
|
Title *string `json:"title,omitempty"`
|
|
Description *string `json:"description,omitempty"`
|
|
Category *string `json:"category,omitempty"`
|
|
Priority *string `json:"priority,omitempty"`
|
|
Status *string `json:"status,omitempty"`
|
|
DueDate *time.Time `json:"due_date,omitempty"`
|
|
}
|
|
|
|
// CreateCommunicationRequest is the request body for creating a communication entry.
|
|
type CreateCommunicationRequest struct {
|
|
Direction string `json:"direction" binding:"required"`
|
|
Channel string `json:"channel" binding:"required"`
|
|
Subject string `json:"subject" binding:"required"`
|
|
Content string `json:"content"`
|
|
Participants string `json:"participants"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Summary Models
|
|
// ============================================================================
|
|
|
|
// HoursSummary provides aggregated hour statistics for an assignment.
|
|
type HoursSummary struct {
|
|
TotalHours float64 `json:"total_hours"`
|
|
BillableHours float64 `json:"billable_hours"`
|
|
ByCategory map[string]float64 `json:"by_category"`
|
|
Period string `json:"period"` // YYYY-MM or "all"
|
|
}
|