Skip to content
Merged
62 changes: 36 additions & 26 deletions metal/cli/seo/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,46 +22,56 @@ func NewClient(routes *router.WebsiteRoutes) *Client {
}
}

func (c *Client) GetTalks() (*payload.TalksResponse, error) {
var talks payload.TalksResponse
func get[T any](handler func() router.StaticRouteResource, entityName string) (*T, error) {
var response T

fn := func() router.StaticRouteResource {
return handler.MakeTalksHandler(c.Fixture.GetTalksFile())
if err := fetch[T](&response, handler); err != nil {
return nil, fmt.Errorf("error fetching %s: %w", entityName, err)
}

if err := fetch[payload.TalksResponse](&talks, fn); err != nil {
return nil, fmt.Errorf("home: error fetching talks: %w", err)
}
return &response, nil
}

return &talks, nil
func (c *Client) GetTalks() (*payload.TalksResponse, error) {
return get[payload.TalksResponse](func() router.StaticRouteResource {
return handler.MakeTalksHandler(c.Fixture.GetTalksFile())
}, "talks")
}

func (c *Client) GetProfile() (*payload.ProfileResponse, error) {
var profile payload.ProfileResponse

fn := func() router.StaticRouteResource {
return get[payload.ProfileResponse](func() router.StaticRouteResource {
return handler.MakeProfileHandler(c.Fixture.GetProfileFile())
}

if err := fetch[payload.ProfileResponse](&profile, fn); err != nil {
return nil, fmt.Errorf("error fetching profile: %w", err)
}

return &profile, nil
}, "profile")
}

func (c *Client) GetProjects() (*payload.ProjectsResponse, error) {
var projects payload.ProjectsResponse

fn := func() router.StaticRouteResource {
return get[payload.ProjectsResponse](func() router.StaticRouteResource {
return handler.MakeProjectsHandler(c.Fixture.GetProjectsFile())
}
}, "projects")
}

if err := fetch[payload.ProjectsResponse](&projects, fn); err != nil {
return nil, fmt.Errorf("error fetching projects: %w", err)
}
func (c *Client) GetSocial() (*payload.SocialResponse, error) {
return get[payload.SocialResponse](func() router.StaticRouteResource {
return handler.MakeSocialHandler(c.Fixture.GetSocialFile())
}, "social")
}

func (c *Client) GetRecommendations() (*payload.RecommendationsResponse, error) {
return get[payload.RecommendationsResponse](func() router.StaticRouteResource {
return handler.MakeRecommendationsHandler(c.Fixture.GetRecommendationsFile())
}, "recommendations")
}

func (c *Client) GetExperience() (*payload.ExperienceResponse, error) {
return get[payload.ExperienceResponse](func() router.StaticRouteResource {
return handler.MakeExperienceHandler(c.Fixture.GetExperienceFile())
}, "experience")
}

return &projects, nil
func (c *Client) GetEducation() (*payload.EducationResponse, error) {
return get[payload.EducationResponse](func() router.StaticRouteResource {
return handler.MakeEducationHandler(c.Fixture.GetEducationFile())
}, "education")
}

func fetch[T any](response *T, handler func() router.StaticRouteResource) error {
Expand Down
36 changes: 36 additions & 0 deletions metal/cli/seo/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,40 @@ func TestClientLoadsFixtures(t *testing.T) {
if len(projects.Data) == 0 {
t.Fatalf("expected projects data")
}

social, err := client.GetSocial()
if err != nil {
t.Fatalf("social err: %v", err)
}

if len(social.Data) == 0 {
t.Fatalf("expected social data")
}

recs, err := client.GetRecommendations()
if err != nil {
t.Fatalf("recommendations err: %v", err)
}

if len(recs.Data) == 0 {
t.Fatalf("expected recommendations data")
}

experience, err := client.GetExperience()
if err != nil {
t.Fatalf("experience err: %v", err)
}

if len(experience.Data) == 0 {
t.Fatalf("expected experience data")
}

education, err := client.GetEducation()
if err != nil {
t.Fatalf("education err: %v", err)
}

if len(education.Data) == 0 {
t.Fatalf("expected education data")
}
}
3 changes: 3 additions & 0 deletions metal/cli/seo/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ const WebHomeName = "Home"
const WebAboutName = "About"
const WebAboutUrl = "/about"

const WebPostsName = "Posts"
const WebPostsUrl = "/posts"

const WebResumeName = "Resume"
const WebResumeUrl = "/resume"

Expand Down
Loading
Loading