diff --git a/internal/user.go b/internal/user.go index 377efcf..d4f97c2 100644 --- a/internal/user.go +++ b/internal/user.go @@ -3,6 +3,7 @@ package internal import ( "context" "fmt" + "git.dragse.it/anthrove/otter-space-sdk/internal/utils" "git.dragse.it/anthrove/otter-space-sdk/pkg/models" "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 anthrovePosts []models.AnthrovePost + var favoritePosts []models.FavoritePost query := ` - MATCH (user:User{user_id: $anthrove_user_id})-[r:FAV]->(p:AnthrovePost) - RETURN p as anthrovePost - ORDER BY id(r) DESC + CALL { + MATCH (user:User{user_id: $anthrove_user_id})-[r:FAV]->(p:AnthrovePost) + RETURN p.post_id AS post_id + ORDER BY id(p) ASC 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{ "anthrove_user_id": anthroveUserID, @@ -345,22 +352,52 @@ func GetUserFavoriteNodeWithPagination(ctx context.Context, driver neo4j.DriverW for i := range result.Records { record := result.Records[i] - post, _, err := neo4j.GetRecordValue[neo4j.Node](record, "anthrovePost") + anthrovePost, _, err := neo4j.GetRecordValue[neo4j.Node](record, "anthrovePost") if err != nil { return nil, err } - anthrovePosts = append(anthrovePosts, models.AnthrovePost{ - PostID: models.AnthrovePostID(post.Props["post_id"].(string)), - Rating: models.AnthroveRating(post.Props["rating"].(string)), - }) + postRelation, _, err := neo4j.GetRecordValue[neo4j.Relationship](record, "postRelation") + if err != nil { + 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{ - "anthrove_user_fav_count": len(anthrovePosts), + "anthrove_user_fav_count": len(favoritePosts), }).Trace("graph: got al anthrove user favorites") - return anthrovePosts, nil + return &models.FavoriteList{Posts: favoritePosts}, nil } diff --git a/pkg/graph/graph.go b/pkg/graph/graph.go index 17666cb..a824319 100644 --- a/pkg/graph/graph.go +++ b/pkg/graph/graph.go @@ -27,6 +27,7 @@ package graph import ( "context" + "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. 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. 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. GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, error) - //TODO - GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) ([]models.AnthrovePost, error) + // 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.FavoriteList, error) } diff --git a/pkg/graph/impl.go b/pkg/graph/impl.go index 3522a7e..4db1b3f 100644 --- a/pkg/graph/impl.go +++ b/pkg/graph/impl.go @@ -96,7 +96,7 @@ func (g *graphConnection) GetAllAnthroveUserIDs(ctx context.Context) ([]models.A 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) }