initial commit

This commit is contained in:
Daniel Noulet 2026-10-07 15:21:47 +02:00
commit e7987e88a7
70 changed files with 13661 additions and 0 deletions

View file

@ -0,0 +1,140 @@
package service
import (
"context"
"sync"
"github.com/dnoulet/go-first/internal/model"
"github.com/google/uuid"
)
type ServiceService struct {
mu sync.RWMutex
services map[uuid.UUID]*model.Service
}
func NewServiceService() *ServiceService {
s := &ServiceService{
services: make(map[uuid.UUID]*model.Service),
}
s.seedData()
return s
}
func (s *ServiceService) seedData() {
services := []*model.Service{
{
ID: uuid.New(),
Title: "Web Application Development",
Description: "Custom web applications built with modern technologies. From concept to deployment, we deliver scalable, maintainable solutions tailored to your business needs.",
Icon: "code",
Features: []string{"React/Next.js Frontend", "Go/Java Backend", "REST/GraphQL APIs", "Real-time Features", "Progressive Web Apps", "TypeScript"},
Order: 1,
Active: true,
},
{
ID: uuid.New(),
Title: "Backend & API Development",
Description: "Robust backend systems and APIs designed for scale. Microservices, event-driven architectures, and high-performance systems that power your business logic.",
Icon: "server",
Features: []string{"Microservices Architecture", "REST & GraphQL APIs", "gRPC Services", "Event-Driven Systems", "Database Design", "Caching Strategies"},
Order: 2,
Active: true,
},
{
ID: uuid.New(),
Title: "Cloud Infrastructure & DevOps",
Description: "End-to-end infrastructure solutions on AWS, GCP, or Azure. Container orchestration, CI/CD pipelines, monitoring, and infrastructure as code.",
Icon: "cloud",
Features: []string{"Kubernetes & Docker", "AWS/GCP/Azure", "Terraform/IaC", "CI/CD Pipelines", "Monitoring & Logging", "Security Hardening"},
Order: 3,
Active: true,
},
{
ID: uuid.New(),
Title: "System Architecture & Consulting",
Description: "Expert architectural guidance for complex systems. Technology selection, scalability planning, performance optimization, and technical debt reduction.",
Icon: "architecture",
Features: []string{"System Design Reviews", "Technology Evaluation", "Scalability Planning", "Performance Optimization", "Migration Strategies", "Code Audits"},
Order: 4,
Active: true,
},
{
ID: uuid.New(),
Title: "Legacy Modernization",
Description: "Transform legacy systems into modern, maintainable applications. Strangler fig pattern, domain-driven design, and incremental migration strategies.",
Icon: "refresh",
Features: []string{"Legacy Assessment", "Strangler Fig Migration", "Domain-Driven Design", "Data Migration", "API Facade Pattern", "Automated Testing"},
Order: 5,
Active: true,
},
{
ID: uuid.New(),
Title: "Technical Advisory & CTO Services",
Description: "Fractional CTO and technical advisory services for startups and scale-ups. Technology strategy, team building, and technical roadmap planning.",
Icon: "advisor",
Features: []string{"Technology Strategy", "Team Building & Hiring", "Technical Roadmaps", "Vendor Evaluation", "Architecture Decisions", "Investor Technical Due Diligence"},
Order: 6,
Active: true,
},
}
for _, svc := range services {
s.services[svc.ID] = svc
}
}
func (s *ServiceService) GetAll(ctx context.Context) ([]*model.Service, error) {
s.mu.RLock()
defer s.mu.RUnlock()
var result []*model.Service
for _, svc := range s.services {
if svc.Active {
result = append(result, svc)
}
}
return result, nil
}
func (s *ServiceService) GetByID(ctx context.Context, id uuid.UUID) (*model.Service, error) {
s.mu.RLock()
defer s.mu.RUnlock()
svc, ok := s.services[id]
if !ok {
return nil, ErrNotFound
}
return svc, nil
}
func (s *ServiceService) Create(ctx context.Context, svc *model.Service) (*model.Service, error) {
s.mu.Lock()
defer s.mu.Unlock()
svc.ID = uuid.New()
s.services[svc.ID] = svc
return svc, nil
}
func (s *ServiceService) Update(ctx context.Context, svc *model.Service) (*model.Service, error) {
s.mu.Lock()
defer s.mu.Unlock()
if _, ok := s.services[svc.ID]; !ok {
return nil, ErrNotFound
}
s.services[svc.ID] = svc
return svc, nil
}
func (s *ServiceService) Delete(ctx context.Context, id uuid.UUID) error {
s.mu.Lock()
defer s.mu.Unlock()
if _, ok := s.services[id]; !ok {
return ErrNotFound
}
delete(s.services, id)
return nil
}