Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions application/article/getArticlesByAuthor/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ import (
type Response struct {
ValidationErrors domain.ValidationErrors `json:"errors,omitempty"`

Author authorResponse `json:"author"`
Author authorResponse `json:"author"`
// How much of each kind the author has published, so the page can label both
// content tabs without asking twice.
Totals totalsResponse `json:"totals"`
LanguageCode languageResponse `json:"language_code"`
Items []articleResponse `json:"items"`
Elements []element.Response `json:"elements"`
Expand All @@ -30,6 +33,11 @@ type articleResponse struct {
AvailableLanguages []languageResponse `json:"available_languages"`
}

type totalsResponse struct {
Articles uint `json:"articles"`
Notes uint `json:"notes"`
}

type authorResponse struct {
UUID string `json:"uuid"`
Name string `json:"name"`
Expand All @@ -48,7 +56,7 @@ type paginationResponse struct {
CurrentPage uint `json:"current_page"`
}

func NewResponse(author user.User, a []article.Article, articlesPublishedLanguages map[string][]language.Language, requestedLanguage language.Language, elementsResponse []element.Response, totalPages, currentPage uint) *Response {
func NewResponse(author user.User, a []article.Article, articlesPublishedLanguages map[string][]language.Language, requestedLanguage language.Language, elementsResponse []element.Response, totalArticles, totalNotes uint, totalPages, currentPage uint) *Response {
items := make([]articleResponse, len(a))

for i := range a {
Expand Down Expand Up @@ -77,6 +85,10 @@ func NewResponse(author user.User, a []article.Article, articlesPublishedLanguag
Username: author.Username,
CreatedAt: author.CreatedAt.Format(time.RFC3339),
},
Totals: totalsResponse{
Articles: totalArticles,
Notes: totalNotes,
},
LanguageCode: languageResponse{
Code: requestedLanguage.Code,
Name: requestedLanguage.Name,
Expand Down
12 changes: 11 additions & 1 deletion application/article/getArticlesByAuthor/usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ import (
"github.com/khanzadimahdi/testproject/domain"
"github.com/khanzadimahdi/testproject/domain/article"
"github.com/khanzadimahdi/testproject/domain/language"
"github.com/khanzadimahdi/testproject/domain/note"
"github.com/khanzadimahdi/testproject/domain/user"
)

const limit = 10

type UseCase struct {
articleRepository article.Repository
noteRepository note.Repository
userRepository user.Repository
languageRepository language.Repository
languageResolver resolver.Resolver
Expand All @@ -25,6 +27,7 @@ type UseCase struct {

func NewUseCase(
articleRepository article.Repository,
noteRepository note.Repository,
userRepository user.Repository,
languageRepository language.Repository,
languageResolver resolver.Resolver,
Expand All @@ -33,6 +36,7 @@ func NewUseCase(
) *UseCase {
return &UseCase{
articleRepository: articleRepository,
noteRepository: noteRepository,
userRepository: userRepository,
languageRepository: languageRepository,
languageResolver: languageResolver,
Expand Down Expand Up @@ -73,6 +77,12 @@ func (uc *UseCase) Execute(ctx context.Context, request *Request) (*Response, er
return nil, err
}

// Only for the notes tab's label.
totalNotes, err := uc.noteRepository.CountPublishedByAuthor(ctx, author.UUID, languageCode)
if err != nil {
return nil, err
}

currentPage := request.Page
if currentPage == 0 {
currentPage = 1
Expand Down Expand Up @@ -117,7 +127,7 @@ func (uc *UseCase) Execute(ctx context.Context, request *Request) (*Response, er
publishedLanguages[a[i].UUID] = al
}

return NewResponse(author, a, publishedLanguages, l, elementsResponse, totalPages, currentPage), nil
return NewResponse(author, a, publishedLanguages, l, elementsResponse, totalArticles, totalNotes, totalPages, currentPage), nil
}

func (uc *UseCase) resolveAuthor(ctx context.Context, request *Request) (user.User, error) {
Expand Down
26 changes: 19 additions & 7 deletions application/article/getArticlesByAuthor/usecase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/khanzadimahdi/testproject/infrastructure/repository/mocks/articles"
"github.com/khanzadimahdi/testproject/infrastructure/repository/mocks/elements"
"github.com/khanzadimahdi/testproject/infrastructure/repository/mocks/languages"
"github.com/khanzadimahdi/testproject/infrastructure/repository/mocks/notes"
"github.com/khanzadimahdi/testproject/infrastructure/repository/mocks/users"
"github.com/khanzadimahdi/testproject/infrastructure/validator"
"github.com/stretchr/testify/assert"
Expand All @@ -30,6 +31,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand Down Expand Up @@ -64,13 +66,14 @@ func TestUseCase_Execute(t *testing.T) {
defer userRepository.AssertExpectations(t)

articleRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(len(a)), nil)
notesRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(0), nil)
articleRepository.On("GetPublishedByAuthor", mock.Anything, authorUUID, "EN", uint(0), uint(10)).Once().Return(a, nil)
elementsRepository.On("Count", mock.Anything).Once().Return(uint(0), nil)
articleRepository.On("GetPublishedLanguageCodes", mock.Anything, "").Return([]string{}, nil)
languagesRepository.On("GetByCodes", mock.Anything, []string{}).Return([]language.Language{}, nil)
defer articleRepository.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

assert.NoError(t, err)
assert.NotNil(t, response)
Expand All @@ -87,6 +90,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand Down Expand Up @@ -117,13 +121,14 @@ func TestUseCase_Execute(t *testing.T) {
defer userRepository.AssertExpectations(t)

articleRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(len(a)), nil)
notesRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(0), nil)
articleRepository.On("GetPublishedByAuthor", mock.Anything, authorUUID, "EN", uint(0), uint(10)).Once().Return(a, nil)
elementsRepository.On("Count", mock.Anything).Once().Return(uint(0), nil)
articleRepository.On("GetPublishedLanguageCodes", mock.Anything, "").Return([]string{}, nil)
languagesRepository.On("GetByCodes", mock.Anything, []string{}).Return([]language.Language{}, nil)
defer articleRepository.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

userRepository.AssertNotCalled(t, "GetOneByIdentity")

Expand All @@ -137,6 +142,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand All @@ -154,7 +160,7 @@ func TestUseCase_Execute(t *testing.T) {
requestValidator.On("Validate", &request).Once().Return(expectedResponse.ValidationErrors)
defer requestValidator.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

userRepository.AssertNotCalled(t, "GetOne")
userRepository.AssertNotCalled(t, "GetOneByIdentity")
Expand All @@ -170,6 +176,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand All @@ -189,7 +196,7 @@ func TestUseCase_Execute(t *testing.T) {
userRepository.On("GetOneByIdentity", mock.Anything, request.Username).Once().Return(user.User{}, domain.ErrNotExists)
defer userRepository.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

articleRepository.AssertNotCalled(t, "CountPublishedByAuthor")
articleRepository.AssertNotCalled(t, "GetPublishedByAuthor")
Expand All @@ -203,6 +210,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand All @@ -223,7 +231,7 @@ func TestUseCase_Execute(t *testing.T) {
userRepository.On("GetOneByIdentity", mock.Anything, request.Username).Once().Return(user.User{}, expectedErr)
defer userRepository.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

articleRepository.AssertNotCalled(t, "CountPublishedByAuthor")
articleRepository.AssertNotCalled(t, "GetPublishedByAuthor")
Expand All @@ -237,6 +245,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand All @@ -260,9 +269,10 @@ func TestUseCase_Execute(t *testing.T) {
defer userRepository.AssertExpectations(t)

articleRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(0), expectedErr)
notesRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(0), nil)
defer articleRepository.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

articleRepository.AssertNotCalled(t, "GetPublishedByAuthor")

Expand All @@ -275,6 +285,7 @@ func TestUseCase_Execute(t *testing.T) {

var (
articleRepository articles.MockArticlesRepository
notesRepository notes.MockNotesRepository
elementsRepository elements.MockElementsRepository
userRepository users.MockUsersRepository
languagesRepository languages.MockLanguagesRepository
Expand All @@ -298,10 +309,11 @@ func TestUseCase_Execute(t *testing.T) {
defer userRepository.AssertExpectations(t)

articleRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(5), nil)
notesRepository.On("CountPublishedByAuthor", mock.Anything, authorUUID, "EN").Once().Return(uint(0), nil)
articleRepository.On("GetPublishedByAuthor", mock.Anything, authorUUID, "EN", uint(0), uint(10)).Once().Return(nil, expectedErr)
defer articleRepository.AssertExpectations(t)

response, err := NewUseCase(&articleRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)
response, err := NewUseCase(&articleRepository, &notesRepository, &userRepository, &languagesRepository, &languageResolver, element.NewRetriever(&articleRepository, &elementsRepository, &userRepository, matcher.New()), &requestValidator).Execute(context.Background(), &request)

assert.ErrorIs(t, err, expectedErr)
assert.Nil(t, response)
Expand Down
95 changes: 0 additions & 95 deletions application/article/getArticlesByHashtag/response.go

This file was deleted.

Loading
Loading