Files
cv-site/internal/models/cv/cv.go
T
juanatsap 542419de45 feat: category icon badges on projects — CLI, App, Web, Plugin, SDK
Each project now shows a colored icon badge indicating its type:
- CLI (purple terminal), App (blue apple), Web (cyan globe)
- WebApp (teal app), Plugin (amber puzzle), SDK (violet package)
- Contrib (gray pull request)
2026-05-04 14:28:37 +01:00

175 lines
7.2 KiB
Go

package cv
import "html/template"
// CV represents the complete curriculum vitae structure
type CV struct {
Personal Personal `json:"personal"`
SEO SEO `json:"seo"`
Summary string `json:"summary"`
SkillsSummary template.HTML `json:"skillsSummary"`
Experience []Experience `json:"experience"`
Education []Education `json:"education"`
Skills Skills `json:"skills"`
Languages []Language `json:"languages"`
Projects []Project `json:"projects"`
Awards []Award `json:"awards"`
Certifications []Certification `json:"certifications"`
Courses []Course `json:"courses"`
References []Reference `json:"references"`
Other Other `json:"other"`
Meta Meta `json:"meta"`
}
type Personal struct {
Name string `json:"name"`
Title string `json:"title"`
TitleBadges []string `json:"titleBadges"`
Location string `json:"location"`
Email string `json:"email"`
Phone string `json:"phone"`
DateOfBirth string `json:"dateOfBirth"`
PlaceOfBirth string `json:"placeOfBirth"`
Citizenship string `json:"citizenship"`
LinkedIn string `json:"linkedin"`
GitHub string `json:"github"`
Domestika string `json:"domestika"`
Website string `json:"website"`
Photo string `json:"photo"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Username string `json:"username"`
}
type SEO struct {
PageTitle string `json:"pageTitle"`
MetaTitle string `json:"metaTitle"`
MetaDescription string `json:"metaDescription"`
OgDescription string `json:"ogDescription"`
Keywords string `json:"keywords"`
}
type Experience struct {
Position string `json:"position"`
Company string `json:"company"`
CompanyID string `json:"companyID,omitempty"` // Unique ID for scrolling/navigation
CompanyURL string `json:"companyURL,omitempty"` // Optional URL for company website
CompanyLogo string `json:"companyLogo"`
LogoIndex *int `json:"logoIndex,omitempty"` // Sprite sheet index (nil means no sprite)
Location string `json:"location"`
StartDate string `json:"startDate"`
EndDate string `json:"endDate"`
Current bool `json:"current"`
Expired bool `json:"expired,omitempty"` // Optional flag for expired companies
ShortDescription string `json:"shortDescription"`
Responsibilities []string `json:"responsibilities"`
Technologies []string `json:"technologies"`
Highlights []string `json:"highlights"`
Duration string `json:"-"` // Calculated field, not from JSON
}
type Education struct {
Degree string `json:"degree"`
Institution string `json:"institution"`
Location string `json:"location"`
StartDate string `json:"startDate"`
EndDate string `json:"endDate"`
Field string `json:"field"`
}
type Skills struct {
Technical []SkillCategory `json:"technical"`
SoftSkills []string `json:"soft_skills"`
}
type SkillCategory struct {
Category string `json:"category"`
Proficiency int `json:"proficiency"`
Items []string `json:"items"`
Sidebar string `json:"sidebar"` // "left" or "right"
}
type Language struct {
Language string `json:"language"`
Proficiency string `json:"proficiency"`
Level int `json:"level"`
Detail string `json:"detail,omitempty"` // Optional detail like "Oral (Medio/Alto) Escrito (Alto)"
}
type Project struct {
Title string `json:"title"`
Category string `json:"category,omitempty"` // Project type: cli, app, web, webapp, plugin, sdk, contrib
ProjectName string `json:"projectName,omitempty"` // Optional: linkable part of title
ProjectDesc string `json:"projectDesc,omitempty"` // Optional: non-linkable description part
ProjectID string `json:"projectID,omitempty"` // Unique ID for scrolling/navigation
URL string `json:"url"`
ProjectLogo string `json:"projectLogo,omitempty"` // Optional logo filename
LogoIndex *int `json:"logoIndex,omitempty"` // Sprite sheet index (nil means no sprite)
GitRepoUrl string `json:"gitRepoUrl,omitempty"` // Optional git repository URL for dynamic dates
OpenSource bool `json:"openSource,omitempty"` // True if project is open source (shows stars badge)
Location string `json:"location"`
StartDate string `json:"startDate,omitempty"` // Optional static start date
Current bool `json:"current"`
MaintainedBy string `json:"maintainedBy,omitempty"` // Optional maintainer name (e.g., "SAP")
Technologies []string `json:"technologies"`
ShortDescription string `json:"shortDescription"`
Responsibilities []string `json:"responsibilities"`
// Computed fields (not stored in JSON)
ComputedStartDate string `json:"-"` // Dynamically calculated from git repo or system
DynamicDate string `json:"-"` // Current date for ongoing projects
Stars int `json:"-"` // GitHub star count (fetched at runtime)
}
type Award struct {
Title string `json:"title"`
Issuer string `json:"issuer"`
Date string `json:"date"`
Description string `json:"description"`
ShortDescription string `json:"shortDescription,omitempty"`
Responsibilities []string `json:"responsibilities,omitempty"`
AwardLogo string `json:"awardLogo"`
}
type Certification struct {
Name string `json:"name"`
Issuer string `json:"issuer"`
Date string `json:"date"`
Description string `json:"description"`
}
type Course struct {
Title string `json:"title"`
Institution string `json:"institution"`
CourseID string `json:"courseID,omitempty"` // Unique ID for scrolling/navigation
CourseLogo string `json:"courseLogo,omitempty"` // Optional logo filename
LogoIndex *int `json:"logoIndex,omitempty"` // Sprite sheet index (nil means no sprite)
Location string `json:"location"`
Date string `json:"date"`
Duration string `json:"duration"`
Description string `json:"description"`
ShortDescription string `json:"shortDescription,omitempty"`
Responsibilities []string `json:"responsibilities,omitempty"`
}
type Reference struct {
Title string `json:"title"`
URL string `json:"url"`
Type string `json:"type"` // "recommendation", "portfolio", "profile", "cv", "presentation"
Action string `json:"action,omitempty"` // Optional action like "downloadPDF"
TextBefore string `json:"textBefore,omitempty"` // Text before the link
LinkText string `json:"linkText,omitempty"` // Bold text inside the link
TextAfter string `json:"textAfter,omitempty"` // Text after the link
}
type Other struct {
DriverLicense string `json:"driverLicense"`
}
type Meta struct {
Version string `json:"version"`
LastUpdated string `json:"lastUpdated"`
Format string `json:"format"`
Language string `json:"language"`
}