Skip to content

Commit

Permalink
feat: toggle functions
Browse files Browse the repository at this point in the history
  • Loading branch information
SShlykov committed Mar 17, 2024
1 parent 6d9384e commit a1eff40
Show file tree
Hide file tree
Showing 34 changed files with 425 additions and 40 deletions.
10 changes: 5 additions & 5 deletions bookback/docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
- [x] Связь сущностей между собой
- [x] логирование и метрики
- [x] Поиск книг по параметрам
- [ ] Тогглер публикации книги/главы/страницы/параграфа


**На потом:**
- [ ] Сделать проверку чаптеров и страниц на последовательность номеров
- [ ] Поиск глав по короткой ссылке
- [ ] Ограничение доступа к книге\главе\странице\параграфу
- [ ] Связь с сервисом авторизации
- [ ] Связь с сервисом хранения файлов
- [ ] Полнотекстовый поиск по книгам


**Новое**
- [ ] Сделать проверку чаптеров и страниц на последовательность номеров

2 changes: 1 addition & 1 deletion bookback/internal/domain/entity/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func (p Page) AllFields() []string {

// InsertOrUpdateFields возвращает список полей, используемых при вставке новой записи
func (p Page) InsertOrUpdateFields() []string {
return []string{"title", "order", "text", "chapter_id", "is_public", "map_params_id"}
return []string{"title", "number", "text", "chapter_id", "is_public", "map_params_id"}
}

// EntityToInsertValues преобразует сущность Page в список значений для вставки
Expand Down
16 changes: 16 additions & 0 deletions bookback/internal/domain/services/book_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type BookService interface {
ListBooks(ctx context.Context, request models.RequestBook) ([]*models.Book, error)

GetTableOfContentsByBookID(ctx context.Context, request models.RequestTOC) (*models.TableOfContents, error)
TogglePublic(ctx context.Context, request models.ToggleBookRequest) (*models.Book, error)
}

type BookRepo interface {
Expand Down Expand Up @@ -123,6 +124,21 @@ func (s *bookService) GetTableOfContentsByBookID(ctx context.Context, request mo
return toc, nil
}

func (s *bookService) TogglePublic(ctx context.Context, request models.ToggleBookRequest) (*models.Book, error) {
book, err := s.repo.FindByID(ctx, request.BookID)
if err != nil {
return nil, err
}

book.IsPublic = !book.IsPublic
book, err = s.repo.Update(ctx, request.BookID, book)
if err != nil {
return nil, err
}

return adapters.BookEntityToModel(book), nil
}

func joinSections(chapters, pages []*entity.Section) []*models.Section {
sections := make([]*models.Section, 0)
pageSectionSet := make(map[string][]*models.Section)
Expand Down
18 changes: 18 additions & 0 deletions bookback/internal/domain/services/bookevents_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ type BookEventsService interface {
GetBookEventsByChapterID(ctx context.Context, chapterID string, request models.RequestBookEvent) ([]*models.BookEvent, error)
GetBookEventsByPageID(ctx context.Context, pageID string, request models.RequestBookEvent) ([]*models.BookEvent, error)
GetBookEventsByParagraphID(ctx context.Context, paragraphID string, request models.RequestBookEvent) ([]*models.BookEvent, error)

TogglePublic(ctx context.Context, request models.ToggleBookEventRequest) (*models.BookEvent, error)
}

type bookEventsService struct {
Expand All @@ -30,6 +32,22 @@ func NewBookEventsService(repo SimpleRepo[*entity.BookEvent]) BookEventsService
return &bookEventsService{repo}
}

func (s *bookEventsService) TogglePublic(ctx context.Context, request models.ToggleBookEventRequest) (*models.BookEvent, error) {
bookEvent, err := s.repo.FindByID(ctx, request.BookEventID)
if err != nil {
return nil, err
}
bookEvent.IsPublic = !bookEvent.IsPublic

var updated *entity.BookEvent
updated, err = s.repo.Update(ctx, request.BookEventID, bookEvent)
if err != nil {
return nil, err
}

return adapters.BookEventEntityToModel(updated), nil
}

func (s *bookEventsService) CreateBookEvent(ctx context.Context, request models.CreateBookEventRequest) (*models.BookEvent, error) {
bookEvent := adapters.BookEventModelToEntity(request.BookEvent)

Expand Down
18 changes: 18 additions & 0 deletions bookback/internal/domain/services/chapter_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ type ChapterService interface {
ListChapters(ctx context.Context, request models.RequestChapter) ([]*models.Chapter, error)

GetChapterByBookID(ctx context.Context, bookID string, request models.RequestChapter) ([]*models.Chapter, error)

TogglePublic(ctx context.Context, request models.ToggleChapterRequest) (*models.Chapter, error)
}

type chapterService struct {
Expand All @@ -29,6 +31,22 @@ func NewChapterService(chapterRepo SimpleRepo[*entity.Chapter]) ChapterService {
return &chapterService{chapterRepo: chapterRepo}
}

func (ch *chapterService) TogglePublic(ctx context.Context, request models.ToggleChapterRequest) (*models.Chapter, error) {
chapter, err := ch.chapterRepo.FindByID(ctx, request.ChapterID)
if err != nil {
return nil, err
}
chapter.IsPublic = !chapter.IsPublic

var updated *entity.Chapter
updated, err = ch.chapterRepo.Update(ctx, request.ChapterID, chapter)
if err != nil {
return nil, err
}

return adapters.ChapterEntityToModel(updated), nil
}

func (ch *chapterService) CreateChapter(ctx context.Context, request models.CreateChapterRequest) (*models.Chapter, error) {
chapter := adapters.ChapterModelToEntity(request.Chapter)

Expand Down
18 changes: 18 additions & 0 deletions bookback/internal/domain/services/page_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ type PageService interface {
ListPages(ctx context.Context, request models.RequestPage) ([]*models.Page, error)

GetPagesByChapterID(ctx context.Context, chapterID string, request models.RequestPage) ([]*models.Page, error)

TogglePublic(ctx context.Context, request models.TogglePageRequest) (*models.Page, error)
}

type pageService struct {
Expand All @@ -28,6 +30,22 @@ func NewPageService(repo SimpleRepo[*entity.Page]) PageService {
return &pageService{repo}
}

func (s *pageService) TogglePublic(ctx context.Context, request models.TogglePageRequest) (*models.Page, error) {
page, err := s.repo.FindByID(ctx, request.PageID)
if err != nil {
return nil, err
}
page.IsPublic = !page.IsPublic

var updated *entity.Page
updated, err = s.repo.Update(ctx, request.PageID, page)
if err != nil {
return nil, err
}

return adapters.PageEntityToModel(updated), nil
}

func (s *pageService) CreatePage(ctx context.Context, request models.CreatePageRequest) (*models.Page, error) {
page := adapters.PageModelToEntity(request.Page)

Expand Down
18 changes: 18 additions & 0 deletions bookback/internal/domain/services/paragraph_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ type ParagraphService interface {
ListParagraphs(ctx context.Context, request models.RequestParagraph) ([]*models.Paragraph, error)

GetParagraphsByPageID(ctx context.Context, pageID string, request models.RequestParagraph) ([]*models.Paragraph, error)

TogglePublic(ctx context.Context, request models.ToggleParagraphRequest) (*models.Paragraph, error)
}

type paragraphService struct {
Expand All @@ -27,6 +29,22 @@ func NewParagraphService(repo SimpleRepo[*entity.Paragraph]) ParagraphService {
return &paragraphService{repo}
}

func (s *paragraphService) TogglePublic(ctx context.Context, request models.ToggleParagraphRequest) (*models.Paragraph, error) {
paragraph, err := s.repo.FindByID(ctx, request.ParagraphID)
if err != nil {
return nil, err
}
paragraph.IsPublic = !paragraph.IsPublic

var updated *entity.Paragraph
updated, err = s.repo.Update(ctx, request.ParagraphID, paragraph)
if err != nil {
return nil, err
}

return adapters.ParagraphEntityToModel(updated), nil
}

func (s *paragraphService) CreateParagraph(ctx context.Context, request models.CreateParagraphRequest) (*models.Paragraph, error) {
paragraph := adapters.ParagraphModelToEntity(request.Paragraph)

Expand Down
1 change: 1 addition & 0 deletions bookback/internal/infrastructure/http/v1/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ const (
BookSubPath = "/book"
ChapterSubPath = "/chapter"
ListSubPath = "/list"
ToggleSubPath = "/toggle"
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package controllers

import (
"context"
"fmt"
"github.com/SShlykov/zeitment/bookback/internal/infrastructure/http/v1/errors"
"github.com/SShlykov/zeitment/bookback/internal/models"
loggerPkg "github.com/SShlykov/zeitment/logger"
Expand All @@ -19,6 +20,7 @@ type bookService interface {
ListBooks(ctx context.Context, request models.RequestBook) ([]*models.Book, error)

GetTableOfContentsByBookID(ctx context.Context, request models.RequestTOC) (*models.TableOfContents, error)
TogglePublic(ctx context.Context, request models.ToggleBookRequest) (*models.Book, error)
}

// BookController структура для HTTP-контроллера книг.
Expand All @@ -34,6 +36,23 @@ func NewBookController(srv bookService, metric metrics.Metrics, logger loggerPkg
return &BookController{Service: srv, Metrics: metric, Logger: logger, Ctx: ctx}
}

func (bc *BookController) TogglePublic(c echo.Context) error {
var request models.ToggleBookRequest
if err := c.Bind(&request); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, errors.ValidationFailed)
}

book, err := bc.Service.TogglePublic(bc.Ctx, request)
if err != nil {
bc.Logger.Info("error", loggerPkg.Err(err))
bc.Metrics.IncCounter("controller.book.TogglePublic.error", err.Error())
return echo.NewHTTPError(http.StatusInternalServerError, errors.Unknown)
}

fmt.Println("book", book)
return c.JSON(http.StatusOK, models.WebResponse[*models.Book]{Data: book, Status: "ok"})
}

func (bc *BookController) GetTableOfContentsByBookID(c echo.Context) error {
var request models.RequestTOC
if err := c.Bind(&request); err != nil {
Expand Down Expand Up @@ -72,7 +91,7 @@ func (bc *BookController) GetBookByID(c echo.Context) error {

book, err := bc.Service.GetBookByID(bc.Ctx, id)
if err != nil {
bc.Logger.Info("error", slog.String("id", id), slog.String("err", err.Error()))
bc.Logger.Info("error", slog.String("id", id), loggerPkg.Err(err))
bc.Metrics.IncCounter("controller.book.GetBookByID.error", err.Error())
return echo.NewHTTPError(http.StatusNotFound, errors.BookNotFound)
}
Expand All @@ -88,7 +107,7 @@ func (bc *BookController) CreateBook(c echo.Context) error {

createdBook, err := bc.Service.CreateBook(bc.Ctx, request)
if err != nil {
bc.Logger.Info("error", slog.String("err", err.Error()))
bc.Logger.Info("error", loggerPkg.Err(err))
bc.Metrics.IncCounter("controller.book.CreateBook.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookNotCreated)
}
Expand All @@ -108,7 +127,7 @@ func (bc *BookController) UpdateBook(c echo.Context) error {

updatedBook, err := bc.Service.UpdateBook(bc.Ctx, id, request)
if err != nil {
bc.Logger.Info("error", slog.String("err", err.Error()))
bc.Logger.Info("error", loggerPkg.Err(err))
bc.Metrics.IncCounter("controller.book.UpdateBook.error", err.Error())
return echo.NewHTTPError(http.StatusInternalServerError, errors.Unknown)
}
Expand All @@ -123,7 +142,7 @@ func (bc *BookController) DeleteBook(c echo.Context) error {

book, err := bc.Service.DeleteBook(bc.Ctx, id)
if err != nil {
bc.Logger.Info("error", slog.String("err", err.Error()))
bc.Logger.Info("error", loggerPkg.Err(err))
bc.Metrics.IncCounter("controller.book.DeleteBook.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookNotDeleted)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestBookController_GetTableOfContentsByBookID(t *testing.T) {
service.EXPECT().GetTableOfContentsByBookID(gomock.Any(), gomock.Any()).Return(toc, nil)

e := echo.New()
req := httptest.NewRequest(http.MethodPost, v1.BooksPath+"/table_of_content", strings.NewReader(fixture.RequestPageOptions))
req := httptest.NewRequest(http.MethodPost, v1.BooksPath+v1.ToggleSubPath, strings.NewReader(fixture.RequestPageOptions))
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
loggerPkg "github.com/SShlykov/zeitment/logger"
"github.com/SShlykov/zeitment/metrics"
"github.com/labstack/echo/v4"
"log/slog"
"net/http"
)

Expand All @@ -21,6 +20,8 @@ type bookEventService interface {
GetBookEventsByChapterID(ctx context.Context, chapterID string, request models.RequestBookEvent) ([]*models.BookEvent, error)
GetBookEventsByPageID(ctx context.Context, pageID string, request models.RequestBookEvent) ([]*models.BookEvent, error)
GetBookEventsByParagraphID(ctx context.Context, paragraphID string, request models.RequestBookEvent) ([]*models.BookEvent, error)

TogglePublic(ctx context.Context, request models.ToggleBookEventRequest) (*models.BookEvent, error)
}

// BookEventController структура для HTTP-контроллера событий книги.
Expand All @@ -37,6 +38,22 @@ func NewBookEventController(srv bookEventService, metric metrics.Metrics,
return &BookEventController{Service: srv, Metrics: metric, Logger: logger, Ctx: ctx}
}

func (bec *BookEventController) TogglePublic(c echo.Context) error {
var request models.ToggleBookEventRequest
if err := c.Bind(&request); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, errors.ValidationFailed)
}

event, err := bec.Service.TogglePublic(bec.Ctx, request)
if err != nil {
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.TogglePublic.error", err.Error())
return echo.NewHTTPError(http.StatusInternalServerError, errors.Unknown)
}

return c.JSON(http.StatusOK, models.WebResponse[*models.BookEvent]{Data: event, Status: "ok"})
}

func (bec *BookEventController) GetBookEventByID(c echo.Context) error {
id := c.Param("id")
if id == "" {
Expand All @@ -45,7 +62,7 @@ func (bec *BookEventController) GetBookEventByID(c echo.Context) error {

event, err := bec.Service.GetBookEventByID(bec.Ctx, id)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.GetBookEventByID.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotFound)
}
Expand All @@ -61,7 +78,7 @@ func (bec *BookEventController) CreateBookEvent(c echo.Context) error {

createdEvent, err := bec.Service.CreateBookEvent(bec.Ctx, request)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.CreateBookEvent.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotCreated)
}
Expand All @@ -81,7 +98,7 @@ func (bec *BookEventController) UpdateBookEvent(c echo.Context) error {

event, err := bec.Service.UpdateBookEvent(bec.Ctx, id, request)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.UpdateBookEvent.error", err.Error())
return echo.NewHTTPError(http.StatusInternalServerError, errors.Unknown)
}
Expand All @@ -97,7 +114,7 @@ func (bec *BookEventController) DeleteBookEvent(c echo.Context) error {

deletedEvent, err := bec.Service.DeleteBookEvent(bec.Ctx, id)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.DeleteBookEvent.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotDeleted)
}
Expand All @@ -118,7 +135,7 @@ func (bec *BookEventController) GetBookEventsByBookID(c echo.Context) error {

events, err := bec.Service.GetBookEventsByBookID(bec.Ctx, id, request)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.GetBookEventsByBookID.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotFound)
}
Expand All @@ -138,7 +155,7 @@ func (bec *BookEventController) GetBookEventsByChapterID(c echo.Context) error {

events, err := bec.Service.GetBookEventsByChapterID(bec.Ctx, id, request)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.GetBookEventsByChapterID.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotFound)
}
Expand All @@ -159,7 +176,7 @@ func (bec *BookEventController) GetBookEventsByPageID(c echo.Context) error {

events, err := bec.Service.GetBookEventsByPageID(bec.Ctx, id, request)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.GetBookEventsByPageID.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotFound)
}
Expand All @@ -180,7 +197,7 @@ func (bec *BookEventController) GetBookEventsByParagraphID(c echo.Context) error

events, err := bec.Service.GetBookEventsByParagraphID(bec.Ctx, id, request)
if err != nil {
bec.Logger.Info("error", slog.String("err", err.Error()))
bec.Logger.Info("error", loggerPkg.Err(err))
bec.Metrics.IncCounter("controller.BookEvent.GetBookEventsByPageID.error", err.Error())
return echo.NewHTTPError(http.StatusBadRequest, errors.BookEventNotFound)
}
Expand Down
Loading

0 comments on commit a1eff40

Please sign in to comment.