feat: added GetUserFavoritePostsWithPagination

This commit is contained in:
SoXX 2024-05-15 11:18:01 +02:00
parent 7487ba3ffe
commit afaf112c5d
3 changed files with 55 additions and 17 deletions

View File

@ -3,6 +3,7 @@ package internal
import ( import (
"context" "context"
"fmt" "fmt"
"git.dragse.it/anthrove/otter-space-sdk/internal/utils" "git.dragse.it/anthrove/otter-space-sdk/internal/utils"
"git.dragse.it/anthrove/otter-space-sdk/pkg/models" "git.dragse.it/anthrove/otter-space-sdk/pkg/models"
"github.com/neo4j/neo4j-go-driver/v5/neo4j" "github.com/neo4j/neo4j-go-driver/v5/neo4j"
@ -316,16 +317,22 @@ func GetAllAnthroveUserIDs(ctx context.Context, driver neo4j.DriverWithContext)
} }
func GetUserFavoriteNodeWithPagination(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID, skip int, limit int) ([]models.AnthrovePost, error) { func GetUserFavoriteNodeWithPagination(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID, skip int, limit int) (*models.FavoriteList, error) {
var err error var err error
var anthrovePosts []models.AnthrovePost var favoritePosts []models.FavoritePost
query := ` query := `
MATCH (user:User{user_id: $anthrove_user_id})-[r:FAV]->(p:AnthrovePost) CALL {
RETURN p as anthrovePost MATCH (user:User{user_id: $anthrove_user_id})-[r:FAV]->(p:AnthrovePost)
ORDER BY id(r) DESC RETURN p.post_id AS post_id
ORDER BY id(p) ASC
SKIP $skip SKIP $skip
LIMIT $limit; LIMIT $limit
}
WITH collect(post_id) AS faves
MATCH (a:AnthrovePost)<-[r:REFERENCE]-(s:Source)
WHERE a.post_id in faves
RETURN a AS anthrovePost, r AS postRelation, s AS Source
` `
params := map[string]any{ params := map[string]any{
"anthrove_user_id": anthroveUserID, "anthrove_user_id": anthroveUserID,
@ -345,22 +352,52 @@ func GetUserFavoriteNodeWithPagination(ctx context.Context, driver neo4j.DriverW
for i := range result.Records { for i := range result.Records {
record := result.Records[i] record := result.Records[i]
post, _, err := neo4j.GetRecordValue[neo4j.Node](record, "anthrovePost") anthrovePost, _, err := neo4j.GetRecordValue[neo4j.Node](record, "anthrovePost")
if err != nil { if err != nil {
return nil, err return nil, err
} }
anthrovePosts = append(anthrovePosts, models.AnthrovePost{ postRelation, _, err := neo4j.GetRecordValue[neo4j.Relationship](record, "postRelation")
PostID: models.AnthrovePostID(post.Props["post_id"].(string)), if err != nil {
Rating: models.AnthroveRating(post.Props["rating"].(string)), return nil, err
}) }
source, _, err := neo4j.GetRecordValue[neo4j.Node](record, "Source")
if err != nil {
return nil, err
}
if len(favoritePosts) != 0 && favoritePosts[len(favoritePosts)-1].AnthrovePost.PostID == models.AnthrovePostID(anthrovePost.Props["post_id"].(string)) {
favoritePosts[len(favoritePosts)-1].Relations = append(favoritePosts[len(favoritePosts)-1].Relations, models.FavoriteRelations{
SourcesID: source.Props["display_name"].(string),
Relations: models.AnthrovePostRelationship{
PostID: postRelation.Props["source_post_id"].(string),
Url: postRelation.Props["url"].(string),
},
})
} else {
favoritePosts = append(favoritePosts, models.FavoritePost{
AnthrovePost: models.AnthrovePost{
PostID: models.AnthrovePostID(anthrovePost.Props["post_id"].(string)),
Rating: models.AnthroveRating(anthrovePost.Props["rating"].(string)),
},
Relations: []models.FavoriteRelations{{
SourcesID: source.Props["display_name"].(string),
Relations: models.AnthrovePostRelationship{
PostID: postRelation.Props["source_post_id"].(string),
Url: postRelation.Props["url"].(string),
},
}},
})
}
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"anthrove_user_fav_count": len(anthrovePosts), "anthrove_user_fav_count": len(favoritePosts),
}).Trace("graph: got al anthrove user favorites") }).Trace("graph: got al anthrove user favorites")
return anthrovePosts, nil return &models.FavoriteList{Posts: favoritePosts}, nil
} }

View File

@ -27,6 +27,7 @@ package graph
import ( import (
"context" "context"
"git.dragse.it/anthrove/otter-space-sdk/pkg/models" "git.dragse.it/anthrove/otter-space-sdk/pkg/models"
) )
@ -86,7 +87,7 @@ type OtterSpace interface {
// It returns a map of source domains to user-source relationships, and an error if the operation fails. // It returns a map of source domains to user-source relationships, and an error if the operation fails.
GetUserSourceLinks(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]models.AnthroveUserRelationship, error) GetUserSourceLinks(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]models.AnthroveUserRelationship, error)
// GetUserSourceLinks retrieves the links between a user and sources in the OtterSpace graph. // GetSpecifiedUserSourceLink GetUserSourceLinks retrieves the links between a user and a specific source in the OtterSpace graph.
// It returns a map of source domains to user-source relationships, and an error if the operation fails. // It returns a map of source domains to user-source relationships, and an error if the operation fails.
GetSpecifiedUserSourceLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]models.AnthroveUserRelationship, error) GetSpecifiedUserSourceLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]models.AnthroveUserRelationship, error)
@ -98,6 +99,6 @@ type OtterSpace interface {
// It returns a slice of user IDs and an error if the operation fails. // It returns a slice of user IDs and an error if the operation fails.
GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, error) GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, error)
//TODO // GetUserFavoritePostsWithPagination gets all user favorites with relation and sources for the given user
GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) ([]models.AnthrovePost, error) GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*models.FavoriteList, error)
} }

View File

@ -96,7 +96,7 @@ func (g *graphConnection) GetAllAnthroveUserIDs(ctx context.Context) ([]models.A
return internal.GetAllAnthroveUserIDs(ctx, g.driver) return internal.GetAllAnthroveUserIDs(ctx, g.driver)
} }
func (g *graphConnection) GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) ([]models.AnthrovePost, error) { func (g *graphConnection) GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*models.FavoriteList, error) {
return internal.GetUserFavoriteNodeWithPagination(ctx, g.driver, anthroveUserID, skip, limit) return internal.GetUserFavoriteNodeWithPagination(ctx, g.driver, anthroveUserID, skip, limit)
} }