mirror of
https://github.com/derfenix/webarchive.git
synced 2026-03-11 21:35:34 +03:00
Initial commit
This commit is contained in:
132
ports/rest/converter.go
Normal file
132
ports/rest/converter.go
Normal 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
75
ports/rest/service.go
Normal 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{},
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user