Compare commits
2 Commits
e29cea6e3c
...
da4fda3597
Author | SHA1 | Date | |
---|---|---|---|
da4fda3597 | |||
a71f759763 |
@ -176,6 +176,7 @@ func TestGetPostBySourceURL(t *testing.T) {
|
|||||||
BaseModel: models.BaseModel[models.AnthrovePostID]{
|
BaseModel: models.BaseModel[models.AnthrovePostID]{
|
||||||
ID: models.AnthrovePostID(fmt.Sprintf("%025s", "1")),
|
ID: models.AnthrovePostID(fmt.Sprintf("%025s", "1")),
|
||||||
},
|
},
|
||||||
|
|
||||||
Rating: "safe",
|
Rating: "safe",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +199,7 @@ func TestGetPostBySourceURL(t *testing.T) {
|
|||||||
t.Fatal("Could not create source", err)
|
t.Fatal("Could not create source", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain))
|
err = CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain), "http://test.org")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Could not create source reference", err)
|
t.Fatal("Could not create source reference", err)
|
||||||
}
|
}
|
||||||
@ -220,7 +221,7 @@ func TestGetPostBySourceURL(t *testing.T) {
|
|||||||
args: args{
|
args: args{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
db: gormDB,
|
db: gormDB,
|
||||||
sourceURL: source.Domain,
|
sourceURL: "http://test.org",
|
||||||
},
|
},
|
||||||
want: post,
|
want: post,
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
@ -297,7 +298,7 @@ func TestGetPostBySourceID(t *testing.T) {
|
|||||||
t.Fatal("Could not create source", err)
|
t.Fatal("Could not create source", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain))
|
err = CreateReferenceBetweenPostAndSource(ctx, gormDB, post.ID, models.AnthroveSourceDomain(source.Domain), "http://test.otg")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Could not create source reference", err)
|
t.Fatal("Could not create source reference", err)
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,10 @@ func CreateUserWithRelationToSource(ctx context.Context, db *gorm.DB, anthroveUs
|
|||||||
return result.Error
|
return result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if result.RowsAffected == 0 {
|
||||||
|
return &otterError.NoDataWritten{}
|
||||||
|
}
|
||||||
|
|
||||||
log.WithFields(log.Fields{
|
log.WithFields(log.Fields{
|
||||||
"anthrove_user_id": anthroveUserID,
|
"anthrove_user_id": anthroveUserID,
|
||||||
"source_id": sourceID,
|
"source_id": sourceID,
|
||||||
@ -283,8 +287,15 @@ func GetUserFavoriteWithPagination(ctx context.Context, db *gorm.DB, anthroveUse
|
|||||||
return &models.FavoriteList{Posts: favoritePosts}, nil
|
return &models.FavoriteList{Posts: favoritePosts}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Workaround, should be changed later maybe, but its not that bad right now
|
||||||
|
type selectFrequencyTag struct {
|
||||||
|
tagName string `gorm:"tag_name"`
|
||||||
|
count int64 `gorm:"count"`
|
||||||
|
tagType models.TagType `gorm:"tag_type"`
|
||||||
|
}
|
||||||
|
|
||||||
func GetUserTagWitRelationToFavedPosts(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID) ([]models.TagsWithFrequency, error) {
|
func GetUserTagWitRelationToFavedPosts(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID) ([]models.TagsWithFrequency, error) {
|
||||||
var userFavorites []models.UserFavorites
|
var queryUserFavorites []selectFrequencyTag
|
||||||
|
|
||||||
if anthroveUserID == "" {
|
if anthroveUserID == "" {
|
||||||
return nil, &otterError.EntityValidationFailed{Reason: otterError.AnthroveUserIDIsEmpty}
|
return nil, &otterError.EntityValidationFailed{Reason: otterError.AnthroveUserIDIsEmpty}
|
||||||
@ -294,55 +305,38 @@ func GetUserTagWitRelationToFavedPosts(ctx context.Context, db *gorm.DB, anthrov
|
|||||||
return nil, &otterError.EntityValidationFailed{Reason: otterError.AnthroveUserIDToShort}
|
return nil, &otterError.EntityValidationFailed{Reason: otterError.AnthroveUserIDToShort}
|
||||||
}
|
}
|
||||||
|
|
||||||
result := db.WithContext(ctx).Where("user_id = ?", string(anthroveUserID)).Find(&userFavorites)
|
rows, err := db.WithContext(ctx).Raw(
|
||||||
if result.Error != nil {
|
`WITH user_posts AS (
|
||||||
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, &otterError.NoDataFound{}
|
||||||
}
|
}
|
||||||
return nil, result.Error
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tagFrequency := make(map[struct {
|
var userFavoritesFrequency = make([]models.TagsWithFrequency, 0)
|
||||||
name string
|
defer rows.Close()
|
||||||
typeName string
|
for rows.Next() {
|
||||||
}]int)
|
var tagName string
|
||||||
|
var count int64
|
||||||
for _, userFavorite := range userFavorites {
|
var tagType string
|
||||||
var post models.Post
|
rows.Scan(&tagName, &count, &tagType)
|
||||||
result = db.WithContext(ctx).Preload("Tags", func(db *gorm.DB) *gorm.DB {
|
userFavoritesFrequency = append(userFavoritesFrequency, models.TagsWithFrequency{
|
||||||
return db.Order("tag_type ASC")
|
Frequency: count,
|
||||||
}).First(&post, "id = ?", userFavorite.PostID)
|
|
||||||
|
|
||||||
if result.Error != nil {
|
|
||||||
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
|
||||||
return nil, &otterError.NoDataFound{}
|
|
||||||
}
|
|
||||||
return nil, result.Error
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tag := range post.Tags {
|
|
||||||
tagFrequency[struct {
|
|
||||||
name string
|
|
||||||
typeName string
|
|
||||||
}{name: tag.Name, typeName: string(tag.Type)}]++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var tagsWithFrequency []models.TagsWithFrequency
|
|
||||||
for data, frequency := range tagFrequency {
|
|
||||||
tagsWithFrequency = append(tagsWithFrequency, models.TagsWithFrequency{
|
|
||||||
Frequency: int64(frequency),
|
|
||||||
Tags: models.Tag{
|
Tags: models.Tag{
|
||||||
Name: data.name,
|
Name: tagName,
|
||||||
Type: models.TagType(data.typeName),
|
Type: models.TagType(tagType),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
log.WithFields(log.Fields{
|
log.WithFields(log.Fields{
|
||||||
"anthrove_user_id": anthroveUserID,
|
"anthrove_user_id": anthroveUserID,
|
||||||
"tag_amount": len(tagsWithFrequency),
|
"tag_amount": len(queryUserFavorites),
|
||||||
}).Trace("database: got user tag node with relation to faved posts")
|
}).Trace("database: got user tag node with relation to faved posts")
|
||||||
|
|
||||||
return tagsWithFrequency, nil
|
return userFavoritesFrequency, nil
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ func TestCreateUserNodeWithSourceRelation(t *testing.T) {
|
|||||||
userID: "e1",
|
userID: "e1",
|
||||||
username: "marius",
|
username: "marius",
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Test 5: no userID",
|
name: "Test 5: no userID",
|
||||||
@ -270,30 +270,33 @@ func TestGetUserSourceBySourceID(t *testing.T) {
|
|||||||
validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1"))
|
validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1"))
|
||||||
invalidUserID := models.AnthroveUserID("XXX")
|
invalidUserID := models.AnthroveUserID("XXX")
|
||||||
|
|
||||||
|
validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1"))
|
||||||
|
|
||||||
|
source := &models.Source{
|
||||||
|
BaseModel: models.BaseModel[models.AnthroveSourceID]{
|
||||||
|
ID: validSourceID,
|
||||||
|
},
|
||||||
|
DisplayName: "e621",
|
||||||
|
Domain: "e621.net",
|
||||||
|
}
|
||||||
|
|
||||||
expectedResult := make(map[string]models.UserSource)
|
expectedResult := make(map[string]models.UserSource)
|
||||||
expectedResult["e621"] = models.UserSource{
|
expectedResult["e621"] = models.UserSource{
|
||||||
UserID: "e1",
|
UserID: "e1",
|
||||||
AccountUsername: "euser",
|
AccountUsername: "euser",
|
||||||
Source: models.Source{
|
Source: models.Source{
|
||||||
DisplayName: "e621",
|
DisplayName: source.DisplayName,
|
||||||
Domain: "e621.net",
|
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 = CreateSource(ctx, gormDB, source)
|
err = CreateSource(ctx, gormDB, source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = CreateUserWithRelationToSource(ctx, gormDB, validUserID, models.AnthroveSourceID(expectedResult["e621"].SourceID), expectedResult["e621"].UserID, expectedResult["e621"].AccountUsername)
|
err = CreateUserWithRelationToSource(ctx, gormDB, validUserID, validSourceID, expectedResult["e621"].UserID, expectedResult["e621"].AccountUsername)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -389,6 +392,7 @@ func TestGetUserSourceBySourceID(t *testing.T) {
|
|||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
got, err := GetUserSourceBySourceID(tt.args.ctx, tt.args.db, tt.args.anthroveUserID, tt.args.sourceID)
|
got, err := GetUserSourceBySourceID(tt.args.ctx, tt.args.db, tt.args.anthroveUserID, tt.args.sourceID)
|
||||||
@ -866,15 +870,15 @@ func TestGetUserTagNodeWitRelationToFavedPosts(t *testing.T) {
|
|||||||
{
|
{
|
||||||
Frequency: 1,
|
Frequency: 1,
|
||||||
Tags: models.Tag{
|
Tags: models.Tag{
|
||||||
Name: tags[1].Name,
|
Name: tags[2].Name,
|
||||||
Type: tags[1].Type,
|
Type: tags[2].Type,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Frequency: 1,
|
Frequency: 1,
|
||||||
Tags: models.Tag{
|
Tags: models.Tag{
|
||||||
Name: tags[2].Name,
|
Name: tags[1].Name,
|
||||||
Type: tags[2].Type,
|
Type: tags[1].Type,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ type OtterSpace interface {
|
|||||||
GetPostByAnthroveID(ctx context.Context, anthrovePostID models.AnthrovePostID) (*models.Post, error)
|
GetPostByAnthroveID(ctx context.Context, anthrovePostID models.AnthrovePostID) (*models.Post, error)
|
||||||
|
|
||||||
// GetPostByURL retrieves a post by its source URL.
|
// GetPostByURL retrieves a post by its source URL.
|
||||||
GetPostByURL(ctx context.Context, sourceUrl string) (*models.Post, error)
|
GetPostByURL(ctx context.Context, postURL string) (*models.Post, error)
|
||||||
|
|
||||||
// GetPostBySourceID retrieves a post by its source ID.
|
// GetPostBySourceID retrieves a post by its source ID.
|
||||||
GetPostBySourceID(ctx context.Context, sourceID models.AnthroveSourceID) (*models.Post, error)
|
GetPostBySourceID(ctx context.Context, sourceID models.AnthroveSourceID) (*models.Post, error)
|
||||||
|
@ -469,6 +469,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T)
|
|||||||
ctx context.Context
|
ctx context.Context
|
||||||
anthrovePostID models.AnthrovePostID
|
anthrovePostID models.AnthrovePostID
|
||||||
sourceDomain models.AnthroveSourceDomain
|
sourceDomain models.AnthroveSourceDomain
|
||||||
|
postURl models.AnthrovePostURL
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@ -481,6 +482,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T)
|
|||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
anthrovePostID: post.ID,
|
anthrovePostID: post.ID,
|
||||||
sourceDomain: "e621.net",
|
sourceDomain: "e621.net",
|
||||||
|
postURl: "http://e621.net/post/eeasd",
|
||||||
},
|
},
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
@ -490,6 +492,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T)
|
|||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
anthrovePostID: "123456",
|
anthrovePostID: "123456",
|
||||||
sourceDomain: "e621.net",
|
sourceDomain: "e621.net",
|
||||||
|
postURl: "",
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -499,6 +502,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T)
|
|||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
anthrovePostID: "1234",
|
anthrovePostID: "1234",
|
||||||
sourceDomain: "fa.banana",
|
sourceDomain: "fa.banana",
|
||||||
|
postURl: "",
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -507,7 +511,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T)
|
|||||||
args: args{
|
args: args{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
anthrovePostID: "696969",
|
anthrovePostID: "696969",
|
||||||
sourceDomain: "hehe.funny.number",
|
postURl: "",
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
}}
|
}}
|
||||||
@ -517,7 +521,7 @@ func Test_postgresqlConnection_CreateReferenceBetweenPostAndSource(t *testing.T)
|
|||||||
db: gormDB,
|
db: gormDB,
|
||||||
debug: true,
|
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)
|
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)
|
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 {
|
if err != nil {
|
||||||
t.Fatal("Could not create source reference", err)
|
t.Fatal("Could not create source reference", err)
|
||||||
}
|
}
|
||||||
@ -850,7 +854,7 @@ func Test_postgresqlConnection_GetPostByURL(t *testing.T) {
|
|||||||
name: "Test 1: Valid sourceUrl",
|
name: "Test 1: Valid sourceUrl",
|
||||||
args: args{
|
args: args{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
sourceUrl: source.Domain,
|
sourceUrl: "https://e62asdwad.com/asdas",
|
||||||
},
|
},
|
||||||
want: post,
|
want: post,
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
@ -931,7 +935,7 @@ func Test_postgresqlConnection_GetPostBySourceID(t *testing.T) {
|
|||||||
t.Fatal("Could not create source", err)
|
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 {
|
if err != nil {
|
||||||
t.Fatal("Could not create source reference", err)
|
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"))
|
validUserID := models.AnthroveUserID(fmt.Sprintf("%025s", "User1"))
|
||||||
invalidUserID := models.AnthroveUserID("XXX")
|
invalidUserID := models.AnthroveUserID("XXX")
|
||||||
|
|
||||||
|
validSourceID := models.AnthroveSourceID(fmt.Sprintf("%025s", "Source1"))
|
||||||
|
|
||||||
expectedResult := make(map[string]models.UserSource)
|
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{
|
expectedResult["e621"] = models.UserSource{
|
||||||
UserID: "e1",
|
UserID: "e1",
|
||||||
AccountUsername: "euser",
|
AccountUsername: "euser",
|
||||||
Source: models.Source{
|
Source: models.Source{
|
||||||
DisplayName: "e621",
|
DisplayName: source.DisplayName,
|
||||||
Domain: "e621.net",
|
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)
|
err = postgres.CreateSource(ctx, gormDB, source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -1605,15 +1613,15 @@ func Test_postgresqlConnection_GetUserTagWitRelationToFavedPosts(t *testing.T) {
|
|||||||
{
|
{
|
||||||
Frequency: 1,
|
Frequency: 1,
|
||||||
Tags: models.Tag{
|
Tags: models.Tag{
|
||||||
Name: tags[1].Name,
|
Name: tags[2].Name,
|
||||||
Type: tags[1].Type,
|
Type: tags[2].Type,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Frequency: 1,
|
Frequency: 1,
|
||||||
Tags: models.Tag{
|
Tags: models.Tag{
|
||||||
Name: tags[2].Name,
|
Name: tags[1].Name,
|
||||||
Type: tags[2].Type,
|
Type: tags[1].Type,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user