package usecase import ( "context" "net/http" "source.toby3d.me/toby3d/home/internal/domain" "source.toby3d.me/toby3d/home/internal/server" ) type serverUseCase struct{} func NewServerUseCase() server.UseCase { return serverUseCase{} } func (serverUseCase) Do(ctx context.Context, site domain.Site) (*domain.Server, error) { if site.Params == nil { return nil, server.ErrParams } serverMap, ok := site.Params["server"].(map[string]any) if !ok { return nil, server.ErrServer } out := domain.NewServer() parseHeaders(out, serverMap) parseRedirects(out, serverMap) return out, nil } func parseHeaders(dst *domain.Server, params map[string]any) error { serverHeadersValues, ok := params["headers"].([]any) if !ok { return server.ErrServerHeaders } for i := range serverHeadersValues { headerMap, ok := serverHeadersValues[i].(map[string]any) if !ok { continue } header := domain.Header{ Headers: make(map[string]string), Path: "", } if header.Path, ok = headerMap["path"].(string); !ok { continue } values, ok := headerMap["values"].(map[string]any) if !ok { continue } for name, value := range values { v, ok := value.(string) if !ok { continue } header.Headers[name] = v } dst.Headers = append(dst.Headers, header) } return nil } func parseRedirects(dst *domain.Server, params map[string]any) error { serverRedirectsValues, ok := params["redirects"].([]any) if !ok { return server.ErrServerRedirects } for i := range serverRedirectsValues { redirectMap, ok := serverRedirectsValues[i].(map[string]any) if !ok { continue } redirect := domain.Redirect{ From: "", To: "", Status: http.StatusMovedPermanently, Force: false, } if redirect.From, ok = redirectMap["from"].(string); !ok { continue } if redirect.To, ok = redirectMap["to"].(string); !ok { continue } if status, ok := redirectMap["status"].(int); ok && status != 0 { redirect.Status = status } redirect.Force, _ = redirectMap["force"].(bool) dst.Redirects = append(dst.Redirects, redirect) } return nil }