Initial commit

This commit is contained in:
2023-03-26 16:11:00 +03:00
commit 92469fa3a2
47 changed files with 5610 additions and 0 deletions

132
ports/rest/converter.go Normal file
View File

@@ -0,0 +1,132 @@
package rest
import (
"github.com/derfenix/webarchive/api/openapi"
"github.com/derfenix/webarchive/entity"
)
func PageToRestWithResults(page *entity.Page) openapi.PageWithResults {
return openapi.PageWithResults{
ID: page.ID,
URL: page.URL,
Created: page.Created,
Formats: func() []openapi.Format {
res := make([]openapi.Format, len(page.Formats))
for i, format := range page.Formats {
res[i] = FormatToRest(format)
}
return res
}(),
Status: StatusToRest(page.Status),
Results: func() []openapi.Result {
results := make([]openapi.Result, len(page.Results.Results()))
for i := range results {
result := &page.Results.Results()[i]
results[i] = openapi.Result{
Format: FormatToRest(result.Format),
Error: openapi.NewOptString(result.Err.Error()),
Files: func() []openapi.ResultFilesItem {
files := make([]openapi.ResultFilesItem, len(results[i].Files))
for j := range files {
file := &result.Files[j]
files[i] = openapi.ResultFilesItem{
ID: file.ID,
Name: file.Name,
Mimetype: file.MimeType,
Size: file.Size,
}
}
return files
}(),
}
}
return results
}(),
}
}
func PageToRest(page *entity.Page) openapi.Page {
return openapi.Page{
ID: page.ID,
URL: page.URL,
Created: page.Created,
Formats: func() []openapi.Format {
res := make([]openapi.Format, len(page.Formats))
for i, format := range page.Formats {
res[i] = FormatToRest(format)
}
return res
}(),
Status: StatusToRest(page.Status),
}
}
func StatusToRest(s entity.Status) openapi.Status {
switch s {
case entity.StatusNew:
return openapi.StatusNew
case entity.StatusProcessing:
return openapi.StatusProcessing
case entity.StatusDone:
return openapi.StatusDone
case entity.StatusFailed:
return openapi.StatusFailed
case entity.StatusWithErrors:
return openapi.StatusWithErrors
default:
return ""
}
}
func FormatFromRest(format []openapi.Format) []entity.Format {
var formats []entity.Format
switch {
case len(format) == 0 || (len(format) == 1 && format[0] == openapi.FormatAll):
formats = []entity.Format{
entity.FormatHeaders,
entity.FormatPDF,
entity.FormatSingleFile,
}
default:
formats = make([]entity.Format, len(format))
for i, format := range format {
switch format {
case openapi.FormatPdf:
formats[i] = entity.FormatPDF
case openapi.FormatHeaders:
formats[i] = entity.FormatHeaders
case openapi.FormatSinglePage:
formats[i] = entity.FormatSingleFile
}
}
}
return formats
}
func FormatToRest(format entity.Format) openapi.Format {
switch format {
case entity.FormatPDF:
return openapi.FormatPdf
case entity.FormatSingleFile:
return openapi.FormatSinglePage
case entity.FormatHeaders:
return openapi.FormatHeaders
default:
return ""
}
}

75
ports/rest/service.go Normal file
View File

@@ -0,0 +1,75 @@
package rest
import (
"context"
"fmt"
"net/http"
"github.com/google/uuid"
"github.com/derfenix/webarchive/api/openapi"
"github.com/derfenix/webarchive/entity"
)
type Pages interface {
ListAll(ctx context.Context) ([]*entity.Page, error)
Save(ctx context.Context, site *entity.Page) error
Get(_ context.Context, id uuid.UUID) (*entity.Page, error)
}
func NewService(sites Pages) *Service {
return &Service{pages: sites}
}
type Service struct {
openapi.UnimplementedHandler
pages Pages
}
func (s *Service) GetPage(ctx context.Context, params openapi.GetPageParams) (openapi.GetPageRes, error) {
page, err := s.pages.Get(ctx, params.ID)
if err != nil {
return &openapi.GetPageNotFound{}, nil
}
restPage := PageToRestWithResults(page)
return &restPage, nil
}
func (s *Service) AddPage(ctx context.Context, req openapi.OptAddPageReq) (*openapi.Page, error) {
site := entity.NewPage(req.Value.URL, req.Value.Description.Value, FormatFromRest(req.Value.Formats)...)
err := s.pages.Save(ctx, site)
if err != nil {
return nil, fmt.Errorf("save site: %w", err)
}
res := PageToRest(site)
return &res, nil
}
func (s *Service) GetPages(ctx context.Context) (openapi.Pages, error) {
sites, err := s.pages.ListAll(ctx)
if err != nil {
return nil, fmt.Errorf("list all: %w", err)
}
res := make(openapi.Pages, len(sites))
for i := range res {
res[i] = PageToRest(sites[i])
}
return res, nil
}
func (s *Service) NewError(_ context.Context, err error) *openapi.ErrorStatusCode {
return &openapi.ErrorStatusCode{
StatusCode: http.StatusInternalServerError,
Response: openapi.Error{
Message: err.Error(),
Localized: openapi.OptString{},
},
}
}