package internal import ( "context" "fmt" "git.dragse.it/anthrove/otter-space-sdk/pkg/models" "github.com/neo4j/neo4j-go-driver/v5/neo4j" log "github.com/sirupsen/logrus" ) func EstablishAnthrovePostToSourceLink(ctx context.Context, driver neo4j.DriverWithContext, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *models.AnthrovePostRelationship) error { query := ` MATCH (sourceNode:Source {domain: $source_url}) MATCH (postNode:AnthrovePost {post_id: $anthrove_post_id}) MERGE (sourceNode)-[:REFERENCE {url: $source_post_url, source_post_id: $source_post_id}]->(postNode) ` params := map[string]any{ "source_url": anthroveSourceDomain, "anthrove_post_id": anthrovePostID, "source_post_url": anthrovePostRelationship.Url, "source_post_id": anthrovePostRelationship.PostID, } _, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer) if err != nil { return err } log.WithFields(log.Fields{ "source_url": anthroveSourceDomain, "anthrove_post_id": anthrovePostID, "source_post_url": anthrovePostRelationship.Url, "source_post_id": anthrovePostRelationship.PostID, }).Trace("graph: creating anthrove post to source link") return nil } func EstablishUserToPostLink(ctx context.Context, driver neo4j.DriverWithContext, anthroveUser *models.AnthroveUser, anthrovePost *models.AnthrovePost) error { query := ` MATCH (user:User {user_id: $anthrove_user_id}) MATCH (anthrovePost:AnthrovePost {post_id: $anthrove_post_id}) MERGE (user)-[:FAV]->(anthrovePost) ` params := map[string]any{ "anthrove_post_id": anthrovePost.PostID, "anthrove_user_id": anthroveUser.UserID, } _, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer) if err != nil { return err } log.WithFields(log.Fields{ "anthrove_post_id": anthrovePost.PostID, "anthrove_user_id": anthroveUser.UserID, }).Trace("graph: created user to post link") return nil } func CheckUserToPostLink(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID, sourcePostID string, sourceUrl string) (bool, error) { query := ` OPTIONAL MATCH (:User {user_id: $anthrove_user_id})-[f:FAV]->(:AnthrovePost)<-[:REFERENCE{source_post_id: $source_post_id}]-(:Source{domain: $source_domain}) RETURN COUNT(f) > 0 AS hasRelationship ` params := map[string]any{ "anthrove_user_id": anthroveUserID, "source_post_id": sourcePostID, "source_domain": sourceUrl, } result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer) if err != nil { return false, err } if len(result.Records) == 0 { return false, fmt.Errorf("no records found") } exists, _, err := neo4j.GetRecordValue[bool](result.Records[0], "hasRelationship") if err != nil { return false, err } log.WithFields(log.Fields{ "relationship_exists": exists, "relationship_anthrove_user_id": anthroveUserID, "relationship_e621_post_id": "", }).Trace("graph: checked user post relationship") return exists, nil }