home/internal/server/usecase/server_ucase.go

112 lines
2.1 KiB
Go

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
}