From da4fda3597e39951b9de9e4a693b4d890a255b19 Mon Sep 17 00:00:00 2001 From: SoXX Date: Thu, 27 Jun 2024 21:37:29 +0200 Subject: [PATCH] refactor(postgres): a lot of things happened here Signed-off-by: SoXX --- internal/postgres/user.go | 37 +++++++++++++++++--------- internal/postgres/user_test.go | 8 +++--- pkg/database/postgres_test.go | 48 ++++++++++++++++++++-------------- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/internal/postgres/user.go b/internal/postgres/user.go index aa5d5a5..d7b365a 100644 --- a/internal/postgres/user.go +++ b/internal/postgres/user.go @@ -73,6 +73,10 @@ func CreateUserWithRelationToSource(ctx context.Context, db *gorm.DB, anthroveUs return result.Error } + if result.RowsAffected == 0 { + return &otterError.NoDataWritten{} + } + log.WithFields(log.Fields{ "anthrove_user_id": anthroveUserID, "source_id": sourceID, @@ -301,23 +305,32 @@ func GetUserTagWitRelationToFavedPosts(ctx context.Context, db *gorm.DB, anthrov return nil, &otterError.EntityValidationFailed{Reason: otterError.AnthroveUserIDToShort} } - result := db.WithContext(ctx).Raw( + rows, err := db.WithContext(ctx).Raw( `WITH user_posts AS ( - SELECT post_id FROM "UserFavorites" WHERE user_id = $1 - ) - SELECT post_tags.tag_name AS tag_name, count(*) AS count, (SELECT tag_type FROM "Tag" WHERE "Tag".name = post_tags.tag_name LIMIT 1) AS tag_type FROM post_tags, user_posts WHERE post_tags.post_id IN (user_posts.post_id) GROUP BY post_tags.tag_name`, anthroveUserID).Scan(&queryUserFavorites) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { + SELECT post_id FROM "UserFavorites" WHERE user_id = $1 + ) + SELECT post_tags.tag_name AS tag_name, count(*) AS count, (SELECT tag_type FROM "Tag" WHERE "Tag".name = post_tags.tag_name LIMIT 1) AS tag_type FROM post_tags, user_posts WHERE post_tags.post_id IN (user_posts.post_id) GROUP BY post_tags.tag_name ORDER BY tag_type DESC, tag_name DESC`, anthroveUserID).Rows() + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { return nil, &otterError.NoDataFound{} } - return nil, result.Error + return nil, err } - var userFavoritesFrequency = make([]models.TagsWithFrequency, len(queryUserFavorites)) - for i, query := range queryUserFavorites { - userFavoritesFrequency[i].Frequency = query.count - userFavoritesFrequency[i].Tags.Name = query.tagName - userFavoritesFrequency[i].Tags.Type = query.tagType + var userFavoritesFrequency = make([]models.TagsWithFrequency, 0) + defer rows.Close() + for rows.Next() { + var tagName string + var count int64 + var tagType string + rows.Scan(&tagName, &count, &tagType) + userFavoritesFrequency = append(userFavoritesFrequency, models.TagsWithFrequency{ + Frequency: count, + Tags: models.Tag{ + Name: tagName, + Type: models.TagType(tagType), + }, + }) } log.WithFields(log.Fields{ diff --git a/internal/postgres/user_test.go b/internal/postgres/user_test.go index 168829a..ea9f2ad 100644 --- a/internal/postgres/user_test.go +++ b/internal/postgres/user_test.go @@ -870,15 +870,15 @@ func TestGetUserTagNodeWitRelationToFavedPosts(t *testing.T) { { Frequency: 1, Tags: models.Tag{ - Name: tags[1].Name, - Type: tags[1].Type, + Name: tags[2].Name, + Type: tags[2].Type, }, }, { Frequency: 1, Tags: models.Tag{ - Name: tags[2].Name, - Type: tags[2].Type, + Name: tags[1].Name, + Type: tags[1].Type, }, }, } diff --git a/pkg/database/postgres_test.go b/pkg/database/postgres_test.go index 4103607..bef6428 100644 --- a/pkg/database/postgres_test.go +++ b/pkg/database/postgres_test.go @@ -469,6 +469,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) ctx context.Context anthrovePostID models.AnthrovePostID sourceDomain models.AnthroveSourceDomain + postURl models.AnthrovePostURL } tests := []struct { name string @@ -481,6 +482,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) ctx: ctx, anthrovePostID: post.ID, sourceDomain: "e621.net", + postURl: "http://e621.net/post/eeasd", }, wantErr: false, }, @@ -490,6 +492,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) ctx: ctx, anthrovePostID: "123456", sourceDomain: "e621.net", + postURl: "", }, wantErr: true, }, @@ -499,6 +502,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) ctx: ctx, anthrovePostID: "1234", sourceDomain: "fa.banana", + postURl: "", }, wantErr: true, }, @@ -507,7 +511,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) args: args{ ctx: ctx, anthrovePostID: "696969", - sourceDomain: "hehe.funny.number", + postURl: "", }, wantErr: true, }} @@ -517,7 +521,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T) db: gormDB, debug: true, } - if err := p.CreateReferenceBetweenPostAndSource(tt.args.ctx, tt.args.anthrovePostID, tt.args.sourceDomain); (err != nil) != tt.wantErr { + if err := p.CreateReferenceBetweenPostAndSource(tt.args.ctx, tt.args.anthrovePostID, tt.args.sourceDomain, tt.args.postURl); (err != nil) != tt.wantErr { t.Errorf("CreateReferenceBetweenPostAndSource() error = %v, wantErr %v", err, tt.wantErr) } }) @@ -830,7 +834,7 @@ func Test_postgresqlConnection_GetPostByURL(t *testing.T) { t.Fatal("Could not create source", err) } - err = postgres.CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain)) + err = postgres.CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain), "https://e62asdwad.com/asdas") if err != nil { t.Fatal("Could not create source reference", err) } @@ -850,7 +854,7 @@ func Test_postgresqlConnection_GetPostByURL(t *testing.T) { name: "Test 1: Valid sourceUrl", args: args{ ctx: ctx, - sourceUrl: source.Domain, + sourceUrl: "https://e62asdwad.com/asdas", }, want: post, wantErr: false, @@ -931,7 +935,7 @@ func Test_postgresqlConnection_GetPostBySourceID(t *testing.T) { t.Fatal("Could not create source", err) } - err = postgres.CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain)) + err = postgres.CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain), "https://easd15aed.de/asd") if err != nil { t.Fatal("Could not create source reference", err) } @@ -1228,30 +1232,34 @@ func Test_postgresqlConnection_GetUserSourceBySourceID(t *testing.T) { validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1")) invalidUserID := models.AnthroveUserID("XXX") + validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1")) + expectedResult := make(map[string]models.UserSource) + + source := &models.Source{ + BaseModel: models.BaseModel[models.AnthroveSourceID]{ + ID: validSourceID, + }, + DisplayName: "e621", + Domain: "e621.net", + } + expectedResult["e621"] = models.UserSource{ UserID: "e1", AccountUsername: "euser", Source: models.Source{ - DisplayName: "e621", - Domain: "e621.net", + DisplayName: source.DisplayName, + Domain: source.Domain, + Icon: source.Icon, }, } - source := &models.Source{ - BaseModel: models.BaseModel[models.AnthroveSourceID]{ - ID: expectedResult["e621"].Source.ID, - }, - DisplayName: expectedResult["e621"].Source.DisplayName, - Domain: expectedResult["e621"].Source.Domain, - } - err = postgres.CreateSource(ctx, gormDB, source) if err != nil { t.Fatal(err) } - err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validUserID, models.AnthroveSourceID(expectedResult["e621"].SourceID), expectedResult["e621"].UserID, expectedResult["e621"].AccountUsername) + err = postgres.CreateUserWithRelationToSource(ctx, gormDB, validUserID, validSourceID, expectedResult["e621"].UserID, expectedResult["e621"].AccountUsername) if err != nil { t.Fatal(err) } @@ -1605,15 +1613,15 @@ func Test_postgresqlConnection_GetUserTagWitRelationToFavedPosts(t *testing.T) { { Frequency: 1, Tags: models.Tag{ - Name: tags[1].Name, - Type: tags[1].Type, + Name: tags[2].Name, + Type: tags[2].Type, }, }, { Frequency: 1, Tags: models.Tag{ - Name: tags[2].Name, - Type: tags[2].Type, + Name: tags[1].Name, + Type: tags[1].Type, }, }, }