112 lines
2.1 KiB
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
|
|
}
|