538 lines
13 KiB
Go
538 lines
13 KiB
Go
package store
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"git.warky.dev/wdevs/amcs/internal/generatedmodels"
|
|
ext "git.warky.dev/wdevs/amcs/internal/types"
|
|
)
|
|
|
|
func projectFromModel(m generatedmodels.ModelPublicProjects) ext.Project {
|
|
return ext.Project{
|
|
ID: m.GUID.UUID(),
|
|
Name: m.Name.String(),
|
|
Description: m.Description.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
LastActiveAt: m.LastActiveAt.Time(),
|
|
}
|
|
}
|
|
|
|
func thoughtFromModel(m generatedmodels.ModelPublicThoughts) (ext.Thought, error) {
|
|
var metadata ext.ThoughtMetadata
|
|
if len(m.Metadata) > 0 {
|
|
if err := json.Unmarshal(m.Metadata, &metadata); err != nil {
|
|
return ext.Thought{}, fmt.Errorf("decode thought metadata: %w", err)
|
|
}
|
|
}
|
|
|
|
var projectID *uuid.UUID
|
|
if m.ProjectID.Valid {
|
|
id := m.ProjectID.UUID()
|
|
projectID = &id
|
|
}
|
|
|
|
var archivedAt *time.Time
|
|
if m.ArchivedAt.Valid {
|
|
t := m.ArchivedAt.Time()
|
|
archivedAt = &t
|
|
}
|
|
|
|
return ext.Thought{
|
|
ID: m.GUID.UUID(),
|
|
Content: m.Content.String(),
|
|
Metadata: metadata,
|
|
ProjectID: projectID,
|
|
ArchivedAt: archivedAt,
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}, nil
|
|
}
|
|
|
|
func storedFileFromModel(m generatedmodels.ModelPublicStoredFiles) ext.StoredFile {
|
|
var thoughtID *uuid.UUID
|
|
if m.ThoughtID.Valid {
|
|
id := m.ThoughtID.UUID()
|
|
thoughtID = &id
|
|
}
|
|
|
|
var projectID *uuid.UUID
|
|
if m.ProjectID.Valid {
|
|
id := m.ProjectID.UUID()
|
|
projectID = &id
|
|
}
|
|
|
|
return ext.StoredFile{
|
|
ID: m.GUID.UUID(),
|
|
ThoughtID: thoughtID,
|
|
ProjectID: projectID,
|
|
Name: m.Name.String(),
|
|
MediaType: m.MediaType.String(),
|
|
Kind: m.Kind.String(),
|
|
Encoding: m.Encoding.String(),
|
|
SizeBytes: m.SizeBytes,
|
|
SHA256: m.Sha256.String(),
|
|
Content: m.Content,
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func maintenanceTaskFromModel(m generatedmodels.ModelPublicMaintenanceTasks) ext.MaintenanceTask {
|
|
var frequencyDays *int
|
|
if m.FrequencyDays.Valid {
|
|
n := int(m.FrequencyDays.Int64())
|
|
frequencyDays = &n
|
|
}
|
|
|
|
var lastCompleted *time.Time
|
|
if m.LastCompleted.Valid {
|
|
t := m.LastCompleted.Time()
|
|
lastCompleted = &t
|
|
}
|
|
|
|
var nextDue *time.Time
|
|
if m.NextDue.Valid {
|
|
t := m.NextDue.Time()
|
|
nextDue = &t
|
|
}
|
|
|
|
return ext.MaintenanceTask{
|
|
ID: m.ID.UUID(),
|
|
Name: m.Name.String(),
|
|
Category: m.Category.String(),
|
|
FrequencyDays: frequencyDays,
|
|
LastCompleted: lastCompleted,
|
|
NextDue: nextDue,
|
|
Priority: m.Priority.String(),
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func maintenanceLogFromModel(m generatedmodels.ModelPublicMaintenanceLogs) ext.MaintenanceLog {
|
|
var cost *float64
|
|
if m.Cost.Valid {
|
|
v := m.Cost.Float64()
|
|
cost = &v
|
|
}
|
|
|
|
return ext.MaintenanceLog{
|
|
ID: m.ID.UUID(),
|
|
TaskID: m.TaskID.UUID(),
|
|
CompletedAt: m.CompletedAt.Time(),
|
|
PerformedBy: m.PerformedBy.String(),
|
|
Cost: cost,
|
|
Notes: m.Notes.String(),
|
|
NextAction: m.NextAction.String(),
|
|
}
|
|
}
|
|
|
|
func householdItemFromModel(m generatedmodels.ModelPublicHouseholdItems) ext.HouseholdItem {
|
|
details := map[string]any{}
|
|
if len(m.Details) > 0 {
|
|
if err := json.Unmarshal(m.Details, &details); err != nil {
|
|
details = map[string]any{}
|
|
}
|
|
}
|
|
|
|
return ext.HouseholdItem{
|
|
ID: m.ID.UUID(),
|
|
Name: m.Name.String(),
|
|
Category: m.Category.String(),
|
|
Location: m.Location.String(),
|
|
Details: details,
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func householdVendorFromModel(m generatedmodels.ModelPublicHouseholdVendors) ext.HouseholdVendor {
|
|
var rating *int
|
|
if m.Rating.Valid {
|
|
v := int(m.Rating.Int64())
|
|
rating = &v
|
|
}
|
|
|
|
var lastUsed *time.Time
|
|
if m.LastUsed.Valid {
|
|
t := m.LastUsed.Time()
|
|
lastUsed = &t
|
|
}
|
|
|
|
return ext.HouseholdVendor{
|
|
ID: m.ID.UUID(),
|
|
Name: m.Name.String(),
|
|
ServiceType: m.ServiceType.String(),
|
|
Phone: m.Phone.String(),
|
|
Email: m.Email.String(),
|
|
Website: m.Website.String(),
|
|
Notes: m.Notes.String(),
|
|
Rating: rating,
|
|
LastUsed: lastUsed,
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func familyMemberFromModel(m generatedmodels.ModelPublicFamilyMembers) ext.FamilyMember {
|
|
var birthDate *time.Time
|
|
if m.BirthDate.Valid {
|
|
t := m.BirthDate.Time()
|
|
birthDate = &t
|
|
}
|
|
|
|
return ext.FamilyMember{
|
|
ID: m.ID.UUID(),
|
|
Name: m.Name.String(),
|
|
Relationship: m.Relationship.String(),
|
|
BirthDate: birthDate,
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func activityFromModel(m generatedmodels.ModelPublicActivities, memberName string) ext.Activity {
|
|
var familyMemberID *uuid.UUID
|
|
if m.FamilyMemberID.Valid {
|
|
id := m.FamilyMemberID.UUID()
|
|
familyMemberID = &id
|
|
}
|
|
|
|
var startDate *time.Time
|
|
if m.StartDate.Valid {
|
|
t := m.StartDate.Time()
|
|
startDate = &t
|
|
}
|
|
|
|
var endDate *time.Time
|
|
if m.EndDate.Valid {
|
|
t := m.EndDate.Time()
|
|
endDate = &t
|
|
}
|
|
|
|
return ext.Activity{
|
|
ID: m.ID.UUID(),
|
|
FamilyMemberID: familyMemberID,
|
|
MemberName: memberName,
|
|
Title: m.Title.String(),
|
|
ActivityType: m.ActivityType.String(),
|
|
DayOfWeek: m.DayOfWeek.String(),
|
|
StartTime: m.StartTime.String(),
|
|
EndTime: m.EndTime.String(),
|
|
StartDate: startDate,
|
|
EndDate: endDate,
|
|
Location: m.Location.String(),
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func importantDateFromModel(m generatedmodels.ModelPublicImportantDates, memberName string) ext.ImportantDate {
|
|
var familyMemberID *uuid.UUID
|
|
if m.FamilyMemberID.Valid {
|
|
id := m.FamilyMemberID.UUID()
|
|
familyMemberID = &id
|
|
}
|
|
|
|
return ext.ImportantDate{
|
|
ID: m.ID.UUID(),
|
|
FamilyMemberID: familyMemberID,
|
|
MemberName: memberName,
|
|
Title: m.Title.String(),
|
|
DateValue: m.DateValue.Time(),
|
|
RecurringYearly: m.RecurringYearly,
|
|
ReminderDaysBefore: int(m.ReminderDaysBefore),
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func professionalContactFromModel(m generatedmodels.ModelPublicProfessionalContacts, tags []string) ext.ProfessionalContact {
|
|
var lastContacted *time.Time
|
|
if m.LastContacted.Valid {
|
|
t := m.LastContacted.Time()
|
|
lastContacted = &t
|
|
}
|
|
|
|
var followUpDate *time.Time
|
|
if m.FollowUpDate.Valid {
|
|
t := m.FollowUpDate.Time()
|
|
followUpDate = &t
|
|
}
|
|
|
|
return ext.ProfessionalContact{
|
|
ID: m.ID.UUID(),
|
|
Name: m.Name.String(),
|
|
Company: m.Company.String(),
|
|
Title: m.Title.String(),
|
|
Email: m.Email.String(),
|
|
Phone: m.Phone.String(),
|
|
LinkedInURL: m.LinkedinURL.String(),
|
|
HowWeMet: m.HowWeMet.String(),
|
|
Tags: tags,
|
|
Notes: m.Notes.String(),
|
|
LastContacted: lastContacted,
|
|
FollowUpDate: followUpDate,
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func contactInteractionFromModel(m generatedmodels.ModelPublicContactInteractions) ext.ContactInteraction {
|
|
return ext.ContactInteraction{
|
|
ID: m.ID.UUID(),
|
|
ContactID: m.ContactID.UUID(),
|
|
InteractionType: m.InteractionType.String(),
|
|
OccurredAt: m.OccurredAt.Time(),
|
|
Summary: m.Summary.String(),
|
|
FollowUpNeeded: m.FollowUpNeeded,
|
|
FollowUpNotes: m.FollowUpNotes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func opportunityFromModel(m generatedmodels.ModelPublicOpportunities) ext.Opportunity {
|
|
var contactID *uuid.UUID
|
|
if m.ContactID.Valid {
|
|
id := m.ContactID.UUID()
|
|
contactID = &id
|
|
}
|
|
|
|
var value *float64
|
|
if m.Value.Valid {
|
|
v := m.Value.Float64()
|
|
value = &v
|
|
}
|
|
|
|
var expectedCloseDate *time.Time
|
|
if m.ExpectedCloseDate.Valid {
|
|
t := m.ExpectedCloseDate.Time()
|
|
expectedCloseDate = &t
|
|
}
|
|
|
|
return ext.Opportunity{
|
|
ID: m.ID.UUID(),
|
|
ContactID: contactID,
|
|
Title: m.Title.String(),
|
|
Description: m.Description.String(),
|
|
Stage: m.Stage.String(),
|
|
Value: value,
|
|
ExpectedCloseDate: expectedCloseDate,
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func recipeFromModel(m generatedmodels.ModelPublicRecipes, tags []string) ext.Recipe {
|
|
var prepTimeMinutes *int
|
|
if m.PrepTimeMinutes.Valid {
|
|
v := int(m.PrepTimeMinutes.Int64())
|
|
prepTimeMinutes = &v
|
|
}
|
|
|
|
var cookTimeMinutes *int
|
|
if m.CookTimeMinutes.Valid {
|
|
v := int(m.CookTimeMinutes.Int64())
|
|
cookTimeMinutes = &v
|
|
}
|
|
|
|
var servings *int
|
|
if m.Servings.Valid {
|
|
v := int(m.Servings.Int64())
|
|
servings = &v
|
|
}
|
|
|
|
var rating *int
|
|
if m.Rating.Valid {
|
|
v := int(m.Rating.Int64())
|
|
rating = &v
|
|
}
|
|
|
|
recipe := ext.Recipe{
|
|
ID: m.ID.UUID(),
|
|
Name: m.Name.String(),
|
|
Cuisine: m.Cuisine.String(),
|
|
PrepTimeMinutes: prepTimeMinutes,
|
|
CookTimeMinutes: cookTimeMinutes,
|
|
Servings: servings,
|
|
Tags: tags,
|
|
Rating: rating,
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
|
|
if err := json.Unmarshal(m.Ingredients, &recipe.Ingredients); err != nil {
|
|
recipe.Ingredients = []ext.Ingredient{}
|
|
}
|
|
if err := json.Unmarshal(m.Instructions, &recipe.Instructions); err != nil {
|
|
recipe.Instructions = []string{}
|
|
}
|
|
return recipe
|
|
}
|
|
|
|
func mealPlanEntryFromModel(m generatedmodels.ModelPublicMealPlans, recipeName string) ext.MealPlanEntry {
|
|
var recipeID *uuid.UUID
|
|
if m.RecipeID.Valid {
|
|
id := m.RecipeID.UUID()
|
|
recipeID = &id
|
|
}
|
|
|
|
var servings *int
|
|
if m.Servings.Valid {
|
|
v := int(m.Servings.Int64())
|
|
servings = &v
|
|
}
|
|
|
|
return ext.MealPlanEntry{
|
|
ID: m.ID.UUID(),
|
|
WeekStart: m.WeekStart.Time(),
|
|
DayOfWeek: m.DayOfWeek.String(),
|
|
MealType: m.MealType.String(),
|
|
RecipeID: recipeID,
|
|
RecipeName: recipeName,
|
|
CustomMeal: m.CustomMeal.String(),
|
|
Servings: servings,
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func shoppingListFromModel(m generatedmodels.ModelPublicShoppingLists) ext.ShoppingList {
|
|
list := ext.ShoppingList{
|
|
ID: m.ID.UUID(),
|
|
WeekStart: m.WeekStart.Time(),
|
|
Notes: m.Notes.String(),
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
if err := json.Unmarshal(m.Items, &list.Items); err != nil {
|
|
list.Items = []ext.ShoppingItem{}
|
|
}
|
|
return list
|
|
}
|
|
|
|
func planFromModel(m generatedmodels.ModelPublicPlans, tags []string) ext.Plan {
|
|
var projectID *uuid.UUID
|
|
if m.ProjectID.Valid {
|
|
id := m.ProjectID.UUID()
|
|
projectID = &id
|
|
}
|
|
|
|
var dueDate *time.Time
|
|
if m.DueDate.Valid {
|
|
t := m.DueDate.Time()
|
|
dueDate = &t
|
|
}
|
|
|
|
var completedAt *time.Time
|
|
if m.CompletedAt.Valid {
|
|
t := m.CompletedAt.Time()
|
|
completedAt = &t
|
|
}
|
|
|
|
var lastReviewedAt *time.Time
|
|
if m.LastReviewedAt.Valid {
|
|
t := m.LastReviewedAt.Time()
|
|
lastReviewedAt = &t
|
|
}
|
|
|
|
var supersedesPlanID *uuid.UUID
|
|
if m.SupersedesPlanID.Valid {
|
|
id := m.SupersedesPlanID.UUID()
|
|
supersedesPlanID = &id
|
|
}
|
|
|
|
return ext.Plan{
|
|
ID: m.ID.UUID(),
|
|
Title: m.Title.String(),
|
|
Description: m.Description.String(),
|
|
Status: ext.PlanStatus(m.Status.String()),
|
|
Priority: ext.PlanPriority(m.Priority.String()),
|
|
ProjectID: projectID,
|
|
Owner: m.Owner.String(),
|
|
DueDate: dueDate,
|
|
CompletedAt: completedAt,
|
|
ReviewedBy: m.ReviewedBy.String(),
|
|
LastReviewedAt: lastReviewedAt,
|
|
SupersedesPlanID: supersedesPlanID,
|
|
Tags: tags,
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|
|
|
|
func learningFromModel(m generatedmodels.ModelPublicLearnings, tags []string) ext.Learning {
|
|
var projectID *uuid.UUID
|
|
if m.ProjectID.Valid {
|
|
id := m.ProjectID.UUID()
|
|
projectID = &id
|
|
}
|
|
|
|
var relatedThoughtID *uuid.UUID
|
|
if m.RelatedThoughtID.Valid {
|
|
id := m.RelatedThoughtID.UUID()
|
|
relatedThoughtID = &id
|
|
}
|
|
|
|
var relatedSkillID *uuid.UUID
|
|
if m.RelatedSkillID.Valid {
|
|
id := m.RelatedSkillID.UUID()
|
|
relatedSkillID = &id
|
|
}
|
|
|
|
var duplicateOfLearningID *uuid.UUID
|
|
if m.DuplicateOfLearningID.Valid {
|
|
id := m.DuplicateOfLearningID.UUID()
|
|
duplicateOfLearningID = &id
|
|
}
|
|
|
|
var supersedesLearningID *uuid.UUID
|
|
if m.SupersedesLearningID.Valid {
|
|
id := m.SupersedesLearningID.UUID()
|
|
supersedesLearningID = &id
|
|
}
|
|
|
|
var reviewedBy *string
|
|
if m.ReviewedBy.Valid {
|
|
value := m.ReviewedBy.String()
|
|
reviewedBy = &value
|
|
}
|
|
|
|
var reviewedAt *time.Time
|
|
if m.ReviewedAt.Valid {
|
|
t := m.ReviewedAt.Time()
|
|
reviewedAt = &t
|
|
}
|
|
|
|
return ext.Learning{
|
|
ID: m.ID.UUID(),
|
|
Summary: m.Summary.String(),
|
|
Details: m.Details.String(),
|
|
Category: m.Category.String(),
|
|
Area: m.Area.String(),
|
|
Status: ext.LearningStatus(m.Status.String()),
|
|
Priority: ext.LearningPriority(m.Priority.String()),
|
|
Confidence: ext.LearningEvidenceLevel(m.Confidence.String()),
|
|
ActionRequired: m.ActionRequired,
|
|
SourceType: m.SourceType.String(),
|
|
SourceRef: m.SourceRef.String(),
|
|
ProjectID: projectID,
|
|
RelatedThoughtID: relatedThoughtID,
|
|
RelatedSkillID: relatedSkillID,
|
|
ReviewedBy: reviewedBy,
|
|
ReviewedAt: reviewedAt,
|
|
DuplicateOfLearningID: duplicateOfLearningID,
|
|
SupersedesLearningID: supersedesLearningID,
|
|
Tags: tags,
|
|
CreatedAt: m.CreatedAt.Time(),
|
|
UpdatedAt: m.UpdatedAt.Time(),
|
|
}
|
|
}
|