BREAKING CHANGE: V2 of thr SDK #12
@ -1,46 +0,0 @@
|
||||
package graph
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
neo4jLog "github.com/neo4j/neo4j-go-driver/v5/neo4j/log"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type graphLogger struct {
|
||||
graphDebug bool
|
||||
}
|
||||
|
||||
func NewGraphLogger(graphDebug bool) neo4jLog.Logger {
|
||||
return &graphLogger{graphDebug: graphDebug}
|
||||
}
|
||||
|
||||
func (n graphLogger) Error(name string, id string, err error) {
|
||||
log.WithFields(log.Fields{
|
||||
"name": name,
|
||||
"id": id,
|
||||
}).Errorf("database: %s", err)
|
||||
}
|
||||
|
||||
func (n graphLogger) Warnf(name string, id string, msg string, args ...any) {
|
||||
log.WithFields(log.Fields{
|
||||
"name": name,
|
||||
"id": id,
|
||||
}).Warnf("database: %v", fmt.Sprintf(msg, args...))
|
||||
}
|
||||
|
||||
func (n graphLogger) Infof(name string, id string, msg string, args ...any) {
|
||||
log.WithFields(log.Fields{
|
||||
"name": name,
|
||||
"id": id,
|
||||
}).Infof("database: %v", fmt.Sprintf(msg, args...))
|
||||
}
|
||||
|
||||
func (n graphLogger) Debugf(name string, id string, msg string, args ...any) {
|
||||
if n.graphDebug {
|
||||
log.WithFields(log.Fields{
|
||||
"name": name,
|
||||
"id": id,
|
||||
}).Debugf("database: %v", fmt.Sprintf(msg, args...))
|
||||
}
|
||||
}
|
@ -1,116 +0,0 @@
|
||||
package graph
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func CreateAnthrovePostNode(ctx context.Context, driver neo4j.DriverWithContext, anthrovePost *graphModels.AnthrovePost) error {
|
||||
query := `
|
||||
CREATE (newPostNode:AnthrovePost {post_id: $anthrove_post_id, rating: $anthrove_rating})
|
||||
`
|
||||
|
||||
params := map[string]any{
|
||||
"anthrove_post_id": anthrovePost.PostID,
|
||||
"anthrove_rating": anthrovePost.Rating,
|
||||
}
|
||||
|
||||
_, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_post_id": anthrovePost.PostID,
|
||||
"anthrove_post_rating": anthrovePost.Rating,
|
||||
}).Trace("database: created anthrove post")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func CheckIfAnthrovePostNodeExistsByAnthroveID(ctx context.Context, driver neo4j.DriverWithContext, anthrovePost *graphModels.AnthrovePost) (*graphModels.AnthrovePost, bool, error) {
|
||||
query := `
|
||||
OPTIONAL MATCH (postNode:AnthrovePost {post_id: $anthrove_post_id})
|
||||
RETURN postNode.post_id AS AnthrovePostID
|
||||
`
|
||||
|
||||
params := map[string]any{
|
||||
"anthrove_post_id": anthrovePost.PostID,
|
||||
}
|
||||
|
||||
anthrovePost, exists, err := executeCheckQuery(ctx, driver, query, params)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
|
||||
return anthrovePost, exists, nil
|
||||
}
|
||||
|
||||
func CheckIfAnthrovePostNodeExistsBySourceURl(ctx context.Context, driver neo4j.DriverWithContext, sourceUrl string) (*graphModels.AnthrovePost, bool, error) {
|
||||
query := `
|
||||
OPTIONAL MATCH (postNode:AnthrovePost)<-[:REFERENCE {url: $source_url}]-()
|
||||
RETURN postNode.post_id AS AnthrovePostID
|
||||
`
|
||||
|
||||
params := map[string]any{
|
||||
"source_url": sourceUrl,
|
||||
}
|
||||
anthrovePost, exists, err := executeCheckQuery(ctx, driver, query, params)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
|
||||
return anthrovePost, exists, nil
|
||||
}
|
||||
|
||||
func CheckIfAnthrovePostNodeExistsBySourceID(ctx context.Context, driver neo4j.DriverWithContext, sourcePostID string) (*graphModels.AnthrovePost, bool, error) {
|
||||
query := `
|
||||
OPTIONAL MATCH (postNode:AnthrovePost)<-[:REFERENCE {source_post_id: $source_post_id}]-()
|
||||
RETURN postNode.post_id AS AnthrovePostID
|
||||
`
|
||||
|
||||
params := map[string]any{
|
||||
"source_post_id": sourcePostID,
|
||||
}
|
||||
|
||||
anthrovePost, exists, err := executeCheckQuery(ctx, driver, query, params)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
|
||||
return anthrovePost, exists, nil
|
||||
}
|
||||
|
||||
func executeCheckQuery(ctx context.Context, driver neo4j.DriverWithContext, query string, params map[string]any) (*graphModels.AnthrovePost, bool, error) {
|
||||
|
||||
var anthrovePost graphModels.AnthrovePost
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return &anthrovePost, false, err
|
||||
}
|
||||
|
||||
record := result.Records
|
||||
|
||||
anthrovePostID, isNil, err := neo4j.GetRecordValue[string](record[0], "AnthrovePostID")
|
||||
exists := !isNil
|
||||
if err != nil {
|
||||
return &anthrovePost, exists, err
|
||||
}
|
||||
|
||||
anthrovePost.PostID = models.AnthrovePostID(anthrovePostID)
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_post_id": anthrovePost.PostID,
|
||||
"anthrove_post_exists": exists,
|
||||
}).Trace("database: checked if post exists")
|
||||
|
||||
if !exists {
|
||||
return nil, exists, nil
|
||||
}
|
||||
|
||||
return &anthrovePost, exists, nil
|
||||
}
|
@ -1,100 +0,0 @@
|
||||
package graph
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"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 *graphModels.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("database: creating anthrove post to source link")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func EstablishUserToPostLink(ctx context.Context, driver neo4j.DriverWithContext, anthroveUser *graphModels.AnthroveUser, anthrovePost *graphModels.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("database: 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("database: checked user post relationship")
|
||||
|
||||
return exists, nil
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
package graph
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
|
||||
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func CreateSourceNode(ctx context.Context, driver neo4j.DriverWithContext, anthroveSource *graphModels.AnthroveSource) error {
|
||||
query := `
|
||||
MERGE (sourceNode:Source {domain: $source_url})
|
||||
ON CREATE SET sourceNode.domain = $source_url, sourceNode.display_name = $source_display_name, sourceNode.icon = $source_icon
|
||||
`
|
||||
params := map[string]any{
|
||||
"source_url": anthroveSource.Domain,
|
||||
"source_display_name": anthroveSource.DisplayName,
|
||||
"source_icon": anthroveSource.Icon,
|
||||
}
|
||||
|
||||
_, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return fmt.Errorf("database: %w", err)
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"node_source_url": anthroveSource.Domain,
|
||||
"node_source_displayName": anthroveSource.DisplayName,
|
||||
"node_source_icon": anthroveSource.Icon,
|
||||
}).Trace("database: created source node")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetAllSourceNodes(ctx context.Context, driver neo4j.DriverWithContext) ([]graphModels.AnthroveSource, error) {
|
||||
var sources []graphModels.AnthroveSource
|
||||
|
||||
query := `
|
||||
MATCH (s:Source)
|
||||
RETURN s as source
|
||||
`
|
||||
params := map[string]any{}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
|
||||
source, _, err := neo4j.GetRecordValue[neo4j.Node](record, "source")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sources = append(sources, graphModels.AnthroveSource{
|
||||
DisplayName: source.Props["display_name"].(string),
|
||||
Domain: source.Props["domain"].(string),
|
||||
Icon: source.Props["icon"].(string),
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"tag_amount": len(sources),
|
||||
}).Trace("database: created tag node")
|
||||
|
||||
return sources, nil
|
||||
}
|
||||
|
||||
func GetSourceNodesByURL(ctx context.Context, driver neo4j.DriverWithContext, sourceUrl string) (*graphModels.AnthroveSource, error) {
|
||||
|
||||
var source graphModels.AnthroveSource
|
||||
|
||||
query := `
|
||||
MATCH (s:Source {domain: $source_url})
|
||||
RETURN s as source
|
||||
`
|
||||
params := map[string]any{
|
||||
"source_url": sourceUrl,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, fmt.Errorf("source not found")
|
||||
}
|
||||
|
||||
record, _, err := neo4j.GetRecordValue[neo4j.Node](result.Records[0], "source")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
source.DisplayName = record.Props["display_name"].(string)
|
||||
source.Domain = record.Props["domain"].(string)
|
||||
source.Icon = record.Props["icon"].(string)
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"source_url": sourceUrl,
|
||||
}).Trace("database: got source node")
|
||||
|
||||
return &source, nil
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
package graph
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func CreateTagNodeWitRelation(ctx context.Context, driver neo4j.DriverWithContext, anthrovePostID models.AnthrovePostID, anthroveTag *graphModels.AnthroveTag) error {
|
||||
query := `
|
||||
MATCH (anthrovePost:AnthrovePost {post_id: $anthrove_post_id})
|
||||
MERGE (tagNode:Tag {name: $tag_name, type: $tag_type})
|
||||
MERGE (anthrovePost)-[:HAS]->(tagNode)
|
||||
`
|
||||
params := map[string]interface{}{
|
||||
"tag_name": anthroveTag.Name,
|
||||
"tag_type": anthroveTag.Type,
|
||||
"anthrove_post_id": anthrovePostID,
|
||||
}
|
||||
|
||||
_, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_post_id": anthrovePostID,
|
||||
"tag_name": anthroveTag.Name,
|
||||
"tag_type": anthroveTag.Type,
|
||||
}).Trace("database: created tag node")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetTags(ctx context.Context, driver neo4j.DriverWithContext) ([]graphModels.TagsWithFrequency, error) {
|
||||
var userTags []graphModels.TagsWithFrequency
|
||||
|
||||
query := `
|
||||
MATCH (:AnthrovePost)-[:HAS]->(t:Tag)
|
||||
RETURN t as tag, COUNT(t) AS frequency
|
||||
ORDER BY frequency DESC
|
||||
`
|
||||
params := map[string]any{}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
|
||||
tag, _, err := neo4j.GetRecordValue[neo4j.Node](record, "tag")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
frequency, _, err := neo4j.GetRecordValue[int64](record, "frequency")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
userTags = append(userTags, graphModels.TagsWithFrequency{
|
||||
Frequency: frequency,
|
||||
Tags: graphModels.AnthroveTag{
|
||||
Name: tag.Props["name"].(string),
|
||||
Type: tag.Props["type"].(string),
|
||||
},
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"tag_amount": len(userTags),
|
||||
}).Trace("database: created tag node")
|
||||
|
||||
return userTags, nil
|
||||
}
|
@ -1,454 +0,0 @@
|
||||
package graph
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"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/graphModels"
|
||||
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func CreateUserNodeWithSourceRelation(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID, sourceDomain string, userID string, username string) error {
|
||||
query := `
|
||||
MATCH (userNode:User {user_id: $anthrove_user_id})
|
||||
MATCH (sourceNode:Source {domain: $source_domain})
|
||||
MERGE (userNode)-[r:HAS_ACCOUNT_AT {username: $source_user_name, user_id: $source_user_id}]->(sourceNode)
|
||||
`
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"source_user_id": userID,
|
||||
"source_user_name": username,
|
||||
"source_domain": sourceDomain,
|
||||
}
|
||||
|
||||
_, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var anthroveUserRelationship []graphModels.AnthroveUserRelationship
|
||||
|
||||
anthroveUserRelationship = append(anthroveUserRelationship, graphModels.AnthroveUserRelationship{
|
||||
UserID: userID,
|
||||
Username: username,
|
||||
ScrapeTimeInterval: "",
|
||||
Source: graphModels.AnthroveSource{
|
||||
DisplayName: "",
|
||||
Domain: sourceDomain,
|
||||
Icon: "",
|
||||
},
|
||||
})
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"source_user_id": userID,
|
||||
"source_user_name": username,
|
||||
"source_domain": sourceDomain,
|
||||
}).Trace("database: crated user with relationship")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetUserFavoritesCount(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID) (int64, error) {
|
||||
var userFavoriteCount int64
|
||||
|
||||
query := `
|
||||
MATCH (userNode:User {user_id: $anthrove_user_id})
|
||||
MATCH (userNode)-[:FAV]->(favPost:AnthrovePost)
|
||||
MATCH (sourceNode)-[:REFERENCE]->(favPost)
|
||||
RETURN count( DISTINCT favPost) AS FavoritePostsCount
|
||||
`
|
||||
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
// no matches -> user does not exist, return count 0
|
||||
return userFavoriteCount, err
|
||||
}
|
||||
|
||||
record := result.Records[0]
|
||||
|
||||
userFavoriteCount, _, err = neo4j.GetRecordValue[int64](record, "FavoritePostsCount")
|
||||
if err != nil {
|
||||
return userFavoriteCount, err
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"anthrove_user_fav_count": userFavoriteCount,
|
||||
}).Trace("database: got user favorite count")
|
||||
|
||||
return userFavoriteCount, nil
|
||||
}
|
||||
|
||||
func GetUserSourceLink(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID) (map[string]graphModels.AnthroveUserRelationship, error) {
|
||||
|
||||
userSource := make(map[string]graphModels.AnthroveUserRelationship)
|
||||
|
||||
query := `
|
||||
MATCH (user:User{user_id: $anthrove_user_id})-[r:HAS_ACCOUNT_AT]->(s:Source)
|
||||
RETURN toString(r.user_id) AS sourceUserID, toString(r.username) AS sourceUsername, s as source;
|
||||
`
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, fmt.Errorf("user has no relations")
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
source, _, err := neo4j.GetRecordValue[neo4j.Node](record, "source")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sourceUserID, _, err := neo4j.GetRecordValue[string](record, "sourceUserID")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sourceUsername, _, err := neo4j.GetRecordValue[string](record, "sourceUsername")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
displayName := source.Props["display_name"].(string)
|
||||
domain := source.Props["domain"].(string)
|
||||
icon := source.Props["icon"].(string)
|
||||
|
||||
anthroveSourceUser := graphModels.AnthroveUserRelationship{
|
||||
UserID: sourceUserID,
|
||||
Username: sourceUsername,
|
||||
Source: graphModels.AnthroveSource{
|
||||
DisplayName: displayName,
|
||||
Domain: domain,
|
||||
Icon: icon,
|
||||
},
|
||||
}
|
||||
userSource[displayName] = anthroveSourceUser
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"anthrove_data": userSource,
|
||||
}).Trace("database: got user favorite count")
|
||||
|
||||
return userSource, nil
|
||||
}
|
||||
|
||||
func GetSpecifiedUserSourceLink(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]graphModels.AnthroveUserRelationship, error) {
|
||||
|
||||
userSource := make(map[string]graphModels.AnthroveUserRelationship)
|
||||
|
||||
query := `
|
||||
MATCH (user:User{user_id: $anthrove_user_id})-[r:HAS_ACCOUNT_AT]->(s:Source{display_name: $source_display_name})
|
||||
RETURN toString(r.user_id) AS sourceUserID, toString(r.username) AS sourceUsername, s as source;
|
||||
`
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"source_display_name": sourceDisplayName,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, fmt.Errorf("user has no relations with the source %s", sourceDisplayName)
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
source, _, err := neo4j.GetRecordValue[neo4j.Node](record, "source")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sourceUserID, _, err := neo4j.GetRecordValue[string](record, "sourceUserID")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sourceUsername, _, err := neo4j.GetRecordValue[string](record, "sourceUsername")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
displayName := source.Props["display_name"].(string)
|
||||
domain := source.Props["domain"].(string)
|
||||
icon := source.Props["icon"].(string)
|
||||
|
||||
anthroveSourceUser := graphModels.AnthroveUserRelationship{
|
||||
UserID: sourceUserID,
|
||||
Username: sourceUsername,
|
||||
Source: graphModels.AnthroveSource{
|
||||
DisplayName: displayName,
|
||||
Domain: domain,
|
||||
Icon: icon,
|
||||
},
|
||||
}
|
||||
userSource[displayName] = anthroveSourceUser
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"anthrove_data": userSource,
|
||||
}).Trace("database: got user favorite count")
|
||||
|
||||
return userSource, nil
|
||||
}
|
||||
|
||||
func GetAnthroveUser(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID) (*graphModels.AnthroveUser, error) {
|
||||
var err error
|
||||
var anthroveUser graphModels.AnthroveUser
|
||||
var userSources graphModels.AnthroveSource
|
||||
userRelationships := make([]graphModels.AnthroveUserRelationship, 0)
|
||||
|
||||
query := `
|
||||
MATCH (user:User{user_id: $anthrove_user_id})-[relation:HAS_ACCOUNT_AT]->(source:Source)
|
||||
RETURN user as User, relation as Relation, source as Source;
|
||||
`
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, fmt.Errorf("user has no relations")
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
|
||||
user, _, err := neo4j.GetRecordValue[neo4j.Node](record, "User")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
relation, _, err := neo4j.GetRecordValue[neo4j.Relationship](record, "Relation")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
source, _, err := neo4j.GetRecordValue[neo4j.Node](record, "Source")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
userRelationships = append(userRelationships, graphModels.AnthroveUserRelationship{
|
||||
UserID: fmt.Sprintf("%v", utils.GetOrDefault(relation.Props, "user_id", "")),
|
||||
Username: utils.GetOrDefault(relation.Props, "username", "").(string),
|
||||
ScrapeTimeInterval: utils.GetOrDefault(relation.Props, "scrape_time_interval", "").(string),
|
||||
})
|
||||
|
||||
userSources = graphModels.AnthroveSource{
|
||||
DisplayName: utils.GetOrDefault(source.Props, "display_name", "").(string),
|
||||
Domain: utils.GetOrDefault(source.Props, "domain", "").(string),
|
||||
Icon: utils.GetOrDefault(source.Props, "icon", "").(string),
|
||||
}
|
||||
|
||||
anthroveUser.UserID = models.AnthroveUserID(utils.GetOrDefault(user.Props, "user_id", "").(string))
|
||||
anthroveUser.Relationship = userRelationships
|
||||
|
||||
for j := range userRelationships {
|
||||
anthroveUser.Relationship[j].Source = userSources
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
}).Trace("database: got anthrove user")
|
||||
|
||||
return &anthroveUser, nil
|
||||
|
||||
}
|
||||
|
||||
func GetAllAnthroveUserIDs(ctx context.Context, driver neo4j.DriverWithContext) ([]models.AnthroveUserID, error) {
|
||||
var err error
|
||||
var anthroveUsers []models.AnthroveUserID
|
||||
|
||||
query := `
|
||||
MATCH (anthroveUser:User)
|
||||
RETURN anthroveUser
|
||||
`
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, nil, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
log.Warnf("No users found, this should not be happening!")
|
||||
return []models.AnthroveUserID{}, nil
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
|
||||
user, _, err := neo4j.GetRecordValue[neo4j.Node](record, "anthroveUser")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
anthroveUsers = append(anthroveUsers, models.AnthroveUserID(fmt.Sprintf(user.Props["user_id"].(string))))
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id_count": len(anthroveUsers),
|
||||
}).Trace("database: got al anthrove user IDs")
|
||||
|
||||
return anthroveUsers, nil
|
||||
|
||||
}
|
||||
|
||||
func GetUserFavoriteNodeWithPagination(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID, skip int, limit int) (*graphModels.FavoriteList, error) {
|
||||
var err error
|
||||
var favoritePosts []graphModels.FavoritePost
|
||||
|
||||
query := `
|
||||
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
|
||||
}
|
||||
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
|
||||
ORDER BY id(a) ASC
|
||||
`
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
"limit": limit,
|
||||
"skip": skip,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
|
||||
anthrovePost, _, err := neo4j.GetRecordValue[neo4j.Node](record, "anthrovePost")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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, graphModels.FavoriteRelations{
|
||||
SourcesID: source.Props["display_name"].(string),
|
||||
Relations: graphModels.AnthrovePostRelationship{
|
||||
PostID: postRelation.Props["source_post_id"].(string),
|
||||
Url: postRelation.Props["url"].(string),
|
||||
},
|
||||
})
|
||||
} else {
|
||||
favoritePosts = append(favoritePosts, graphModels.FavoritePost{
|
||||
AnthrovePost: graphModels.AnthrovePost{
|
||||
PostID: models.AnthrovePostID(anthrovePost.Props["post_id"].(string)),
|
||||
Rating: models.Rating(anthrovePost.Props["rating"].(string)),
|
||||
},
|
||||
Relations: []graphModels.FavoriteRelations{{
|
||||
SourcesID: source.Props["display_name"].(string),
|
||||
Relations: graphModels.AnthrovePostRelationship{
|
||||
PostID: postRelation.Props["source_post_id"].(string),
|
||||
Url: postRelation.Props["url"].(string),
|
||||
},
|
||||
}},
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_fav_count": len(favoritePosts),
|
||||
}).Trace("database: got al anthrove user favorites")
|
||||
|
||||
return &graphModels.FavoriteList{Posts: favoritePosts}, nil
|
||||
|
||||
}
|
||||
|
||||
func GetUserTagNodeWitRelationToFavedPosts(ctx context.Context, driver neo4j.DriverWithContext, anthroveUserID models.AnthroveUserID) ([]graphModels.TagsWithFrequency, error) {
|
||||
var userTags []graphModels.TagsWithFrequency
|
||||
|
||||
query := `
|
||||
MATCH (u:User {user_id: $anthrove_user_id})-[:FAV]->(:AnthrovePost)-[:HAS]->(t:Tag)
|
||||
RETURN t as tag, COUNT(t) AS frequency
|
||||
ORDER BY frequency DESC
|
||||
`
|
||||
params := map[string]any{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
}
|
||||
|
||||
result, err := neo4j.ExecuteQuery(ctx, driver, query, params, neo4j.EagerResultTransformer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result.Records) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
for i := range result.Records {
|
||||
record := result.Records[i]
|
||||
|
||||
tag, _, err := neo4j.GetRecordValue[neo4j.Node](record, "tag")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
frequency, _, err := neo4j.GetRecordValue[int64](record, "frequency")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
userTags = append(userTags, graphModels.TagsWithFrequency{
|
||||
Frequency: frequency,
|
||||
Tags: graphModels.AnthroveTag{
|
||||
Name: tag.Props["name"].(string),
|
||||
Type: tag.Props["type"].(string),
|
||||
},
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{
|
||||
"tag_amount": len(userTags),
|
||||
}).Trace("database: created tag node")
|
||||
|
||||
return userTags, nil
|
||||
}
|
@ -6,14 +6,13 @@ import (
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateAnthrovePostNode(ctx context.Context, db *gorm.DB, anthrovePostID models.AnthrovePostID, anthroveRating models.Rating) error {
|
||||
post := pgModels.Post{
|
||||
BaseModel: pgModels.BaseModel{
|
||||
post := models.Post{
|
||||
BaseModel: models.BaseModel{
|
||||
ID: string(anthrovePostID),
|
||||
},
|
||||
Rating: anthroveRating,
|
||||
@ -41,8 +40,8 @@ func CheckIfAnthrovePostNodeExistsByAnthroveID(ctx context.Context, db *gorm.DB,
|
||||
}
|
||||
|
||||
func CheckIfAnthrovePostNodeExistsBySourceURL(ctx context.Context, db *gorm.DB, sourceURL string) (*graphModels.AnthrovePost, bool, error) {
|
||||
postRef := pgModels.PostReference{}
|
||||
err := db.WithContext(ctx).Model(&pgModels.PostReference{}).Where("url = ?", sourceURL).First(&postRef).Error
|
||||
postRef := models.PostReference{}
|
||||
err := db.WithContext(ctx).Model(&models.PostReference{}).Where("url = ?", sourceURL).First(&postRef).Error
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
@ -51,7 +50,7 @@ func CheckIfAnthrovePostNodeExistsBySourceURL(ctx context.Context, db *gorm.DB,
|
||||
return nil, false, err
|
||||
}
|
||||
|
||||
var post pgModels.Post
|
||||
var post models.Post
|
||||
err = db.WithContext(ctx).First(&post, "id = ?", postRef.PostID).Error
|
||||
|
||||
if err != nil {
|
||||
@ -76,7 +75,7 @@ func CheckIfAnthrovePostNodeExistsBySourceID(ctx context.Context, db *gorm.DB, s
|
||||
func executeCheckQuery(ctx context.Context, db *gorm.DB, query string, args ...interface{}) (bool, error) {
|
||||
var count int64
|
||||
|
||||
err := db.WithContext(ctx).Model(&pgModels.Post{}).Where(query, args...).Count(&count).Error
|
||||
err := db.WithContext(ctx).Model(&models.Post{}).Where(query, args...).Count(&count).Error
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -4,13 +4,12 @@ import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func EstablishAnthrovePostToSourceLink(ctx context.Context, db *gorm.DB, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *graphModels.AnthrovePostRelationship) error {
|
||||
var source pgModels.Source
|
||||
var source models.Source
|
||||
var err error
|
||||
|
||||
// Find the source
|
||||
@ -20,7 +19,7 @@ func EstablishAnthrovePostToSourceLink(ctx context.Context, db *gorm.DB, anthrov
|
||||
}
|
||||
|
||||
// Establish the relationship
|
||||
err = db.WithContext(ctx).Create(pgModels.PostReference{
|
||||
err = db.WithContext(ctx).Create(models.PostReference{
|
||||
PostID: string(anthrovePostID),
|
||||
SourceID: source.ID,
|
||||
URL: anthrovePostRelationship.Url,
|
||||
@ -39,7 +38,7 @@ func EstablishAnthrovePostToSourceLink(ctx context.Context, db *gorm.DB, anthrov
|
||||
}
|
||||
|
||||
func EstablishUserToPostLink(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID, anthrovePostID models.AnthrovePostID) error {
|
||||
userFavorite := pgModels.UserFavorite{
|
||||
userFavorite := models.UserFavorite{
|
||||
UserID: string(anthroveUserID),
|
||||
PostID: string(anthrovePostID),
|
||||
}
|
||||
@ -59,7 +58,7 @@ func EstablishUserToPostLink(ctx context.Context, db *gorm.DB, anthroveUserID mo
|
||||
|
||||
func CheckUserToPostLink(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID, anthrovePostID models.AnthrovePostID) (bool, error) {
|
||||
var count int64
|
||||
err := db.WithContext(ctx).Model(&pgModels.UserFavorite{}).Where("user_id = ? AND post_id = ?", string(anthroveUserID), string(anthrovePostID)).Count(&count).Error
|
||||
err := db.WithContext(ctx).Model(&models.UserFavorite{}).Where("user_id = ? AND post_id = ?", string(anthroveUserID), string(anthrovePostID)).Count(&count).Error
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ package postgres
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/test"
|
||||
"gorm.io/gorm"
|
||||
"testing"
|
||||
@ -26,7 +25,7 @@ func TestEstablishAnthrovePostToSourceLink(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
source := &pgModels.Source{
|
||||
source := &models.Source{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
Icon: "icon.e621.net",
|
||||
|
@ -3,20 +3,20 @@ package postgres
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// CreateSourceNode creates a pgModels.Source
|
||||
func CreateSourceNode(ctx context.Context, db *gorm.DB, anthroveSource *pgModels.Source) error {
|
||||
func CreateSourceNode(ctx context.Context, db *gorm.DB, anthroveSource *models.Source) error {
|
||||
|
||||
if anthroveSource.Domain == "" {
|
||||
return fmt.Errorf("anthroveSource domain is required")
|
||||
}
|
||||
|
||||
result := db.WithContext(ctx).Where(pgModels.Source{Domain: anthroveSource.Domain}).FirstOrCreate(anthroveSource)
|
||||
result := db.WithContext(ctx).Where(models.Source{Domain: anthroveSource.Domain}).FirstOrCreate(anthroveSource)
|
||||
|
||||
if result.Error != nil {
|
||||
return result.Error
|
||||
@ -32,8 +32,8 @@ func CreateSourceNode(ctx context.Context, db *gorm.DB, anthroveSource *pgModels
|
||||
}
|
||||
|
||||
// GetAllSourceNodes returns a list of all pgModels.Source
|
||||
func GetAllSourceNodes(ctx context.Context, db *gorm.DB) ([]pgModels.Source, error) {
|
||||
var sources []pgModels.Source
|
||||
func GetAllSourceNodes(ctx context.Context, db *gorm.DB) ([]models.Source, error) {
|
||||
var sources []models.Source
|
||||
|
||||
result := db.WithContext(ctx).Find(&sources)
|
||||
|
||||
@ -49,8 +49,8 @@ func GetAllSourceNodes(ctx context.Context, db *gorm.DB) ([]pgModels.Source, err
|
||||
}
|
||||
|
||||
// GetSourceNodesByURL returns the first source it finds based on the domain
|
||||
func GetSourceNodesByURL(ctx context.Context, db *gorm.DB, domain string) (*pgModels.Source, error) {
|
||||
var sources pgModels.Source
|
||||
func GetSourceNodesByURL(ctx context.Context, db *gorm.DB, domain string) (*models.Source, error) {
|
||||
var sources models.Source
|
||||
|
||||
if domain == "" {
|
||||
return nil, fmt.Errorf("domain is required")
|
||||
|
@ -2,7 +2,7 @@ package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/test"
|
||||
"gorm.io/gorm"
|
||||
"testing"
|
||||
@ -19,13 +19,13 @@ func TestCreateSourceNode(t *testing.T) {
|
||||
|
||||
// Setup Test
|
||||
|
||||
validAnthroveSource := &pgModels.Source{
|
||||
validAnthroveSource := &models.Source{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
Icon: "icon.e621.net",
|
||||
}
|
||||
|
||||
invalidAnthroveSource := &pgModels.Source{
|
||||
invalidAnthroveSource := &models.Source{
|
||||
Domain: "",
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ func TestCreateSourceNode(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
db *gorm.DB
|
||||
anthroveSource *pgModels.Source
|
||||
anthroveSource *models.Source
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
@ -88,7 +88,7 @@ func TestGetAllSourceNodes(t *testing.T) {
|
||||
|
||||
// Setup Test
|
||||
|
||||
sources := []pgModels.Source{
|
||||
sources := []models.Source{
|
||||
{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
@ -121,7 +121,7 @@ func TestGetAllSourceNodes(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want []pgModels.Source
|
||||
want []models.Source
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
@ -159,7 +159,7 @@ func TestGetSourceNodesByURL(t *testing.T) {
|
||||
|
||||
// Setup Test
|
||||
|
||||
source := &pgModels.Source{
|
||||
source := &models.Source{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
Icon: "icon.e621.net",
|
||||
@ -179,7 +179,7 @@ func TestGetSourceNodesByURL(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want *pgModels.Source
|
||||
want *models.Source
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
@ -227,7 +227,7 @@ func TestGetSourceNodesByURL(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func checkSourcesNode(got []pgModels.Source, want []pgModels.Source) bool {
|
||||
func checkSourcesNode(got []models.Source, want []models.Source) bool {
|
||||
for i, source := range want {
|
||||
if source.DisplayName != got[i].DisplayName {
|
||||
return false
|
||||
@ -244,7 +244,7 @@ func checkSourcesNode(got []pgModels.Source, want []pgModels.Source) bool {
|
||||
|
||||
}
|
||||
|
||||
func checkSourceNode(got *pgModels.Source, want *pgModels.Source) bool {
|
||||
func checkSourceNode(got *models.Source, want *models.Source) bool {
|
||||
|
||||
if want == nil && got == nil {
|
||||
return true
|
||||
|
@ -4,12 +4,11 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateTag(ctx context.Context, db *gorm.DB, tag *pgModels.Tag) error {
|
||||
func CreateTag(ctx context.Context, db *gorm.DB, tag *models.Tag) error {
|
||||
|
||||
resultTag := db.WithContext(ctx).Where(tag).Create(tag)
|
||||
|
||||
@ -25,7 +24,7 @@ func CreateTag(ctx context.Context, db *gorm.DB, tag *pgModels.Tag) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func CreateTagNodeWitRelation(ctx context.Context, db *gorm.DB, PostID models.AnthrovePostID, tag *pgModels.Tag) error {
|
||||
func CreateTagNodeWitRelation(ctx context.Context, db *gorm.DB, PostID models.AnthrovePostID, tag *models.Tag) error {
|
||||
|
||||
if PostID == "" {
|
||||
return fmt.Errorf("PostID is empty")
|
||||
@ -37,8 +36,8 @@ func CreateTagNodeWitRelation(ctx context.Context, db *gorm.DB, PostID models.An
|
||||
return resultTag.Error
|
||||
}
|
||||
|
||||
pgPost := pgModels.Post{
|
||||
BaseModel: pgModels.BaseModel{
|
||||
pgPost := models.Post{
|
||||
BaseModel: models.BaseModel{
|
||||
ID: string(PostID),
|
||||
},
|
||||
}
|
||||
@ -58,8 +57,8 @@ func CreateTagNodeWitRelation(ctx context.Context, db *gorm.DB, PostID models.An
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetTags(ctx context.Context, db *gorm.DB) ([]pgModels.Tag, error) {
|
||||
var tags []pgModels.Tag
|
||||
func GetTags(ctx context.Context, db *gorm.DB) ([]models.Tag, error) {
|
||||
var tags []models.Tag
|
||||
result := db.WithContext(ctx).Find(&tags)
|
||||
if result.Error != nil {
|
||||
return nil, result.Error
|
||||
|
@ -3,7 +3,6 @@ package postgres
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/test"
|
||||
"gorm.io/gorm"
|
||||
"testing"
|
||||
@ -25,7 +24,7 @@ func TestCreateTagNodeWitRelation(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
tag := &pgModels.Tag{
|
||||
tag := &models.Tag{
|
||||
Name: "JayTheFerret",
|
||||
Type: "artist",
|
||||
}
|
||||
@ -35,7 +34,7 @@ func TestCreateTagNodeWitRelation(t *testing.T) {
|
||||
ctx context.Context
|
||||
db *gorm.DB
|
||||
PostID models.AnthrovePostID
|
||||
tag *pgModels.Tag
|
||||
tag *models.Tag
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
@ -103,7 +102,7 @@ func TestGetTags(t *testing.T) {
|
||||
|
||||
// Setup Test
|
||||
|
||||
tags := []pgModels.Tag{
|
||||
tags := []models.Tag{
|
||||
{
|
||||
Name: "JayTheFerret",
|
||||
Type: "artist",
|
||||
@ -133,7 +132,7 @@ func TestGetTags(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want []pgModels.Tag
|
||||
want []models.Tag
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
@ -160,7 +159,7 @@ func TestGetTags(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func checkTag(got []pgModels.Tag, want []pgModels.Tag) bool {
|
||||
func checkTag(got []models.Tag, want []models.Tag) bool {
|
||||
for i, tag := range want {
|
||||
if tag.Type != got[i].Type {
|
||||
return false
|
||||
|
@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@ -16,8 +15,8 @@ func CreateUser(ctx context.Context, db *gorm.DB, anthroveUserID models.Anthrove
|
||||
return fmt.Errorf("anthroveUserID cannot be empty")
|
||||
}
|
||||
|
||||
user := pgModels.User{
|
||||
BaseModel: pgModels.BaseModel{
|
||||
user := models.User{
|
||||
BaseModel: models.BaseModel{
|
||||
ID: string(anthroveUserID),
|
||||
},
|
||||
}
|
||||
@ -39,8 +38,8 @@ func CreateUserNodeWithSourceRelation(ctx context.Context, db *gorm.DB, anthrove
|
||||
return fmt.Errorf("anthroveUserID cannot be empty")
|
||||
}
|
||||
|
||||
user := pgModels.User{
|
||||
BaseModel: pgModels.BaseModel{
|
||||
user := models.User{
|
||||
BaseModel: models.BaseModel{
|
||||
ID: string(anthroveUserID),
|
||||
},
|
||||
}
|
||||
@ -52,7 +51,7 @@ func CreateUserNodeWithSourceRelation(ctx context.Context, db *gorm.DB, anthrove
|
||||
return err
|
||||
}
|
||||
|
||||
source := pgModels.Source{
|
||||
source := models.Source{
|
||||
Domain: sourceDomain,
|
||||
}
|
||||
|
||||
@ -63,7 +62,7 @@ func CreateUserNodeWithSourceRelation(ctx context.Context, db *gorm.DB, anthrove
|
||||
return err
|
||||
}
|
||||
|
||||
userSource := pgModels.UserSource{
|
||||
userSource := models.UserSource{
|
||||
UserID: user.ID,
|
||||
SourceID: source.ID,
|
||||
AccountUsername: username,
|
||||
@ -96,7 +95,7 @@ func GetUserFavoritesCount(ctx context.Context, db *gorm.DB, anthroveUserID mode
|
||||
}
|
||||
|
||||
var count int64
|
||||
err := db.WithContext(ctx).Model(&pgModels.UserFavorite{}).Where("user_id = ?", string(anthroveUserID)).Count(&count).Error
|
||||
err := db.WithContext(ctx).Model(&models.UserFavorite{}).Where("user_id = ?", string(anthroveUserID)).Count(&count).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
@ -113,10 +112,10 @@ func GetUserFavoritesCount(ctx context.Context, db *gorm.DB, anthroveUserID mode
|
||||
}
|
||||
|
||||
func GetUserSourceLink(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID) (map[string]graphModels.AnthroveUserRelationship, error) {
|
||||
var userSources []pgModels.UserSource
|
||||
var userSources []models.UserSource
|
||||
userSourceMap := make(map[string]graphModels.AnthroveUserRelationship)
|
||||
|
||||
err := db.WithContext(ctx).Model(&pgModels.UserSource{}).Where("user_id = ?", string(anthroveUserID)).Find(&userSources).Error
|
||||
err := db.WithContext(ctx).Model(&models.UserSource{}).Where("user_id = ?", string(anthroveUserID)).Find(&userSources).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
@ -125,8 +124,8 @@ func GetUserSourceLink(ctx context.Context, db *gorm.DB, anthroveUserID models.A
|
||||
}
|
||||
|
||||
for _, userSource := range userSources {
|
||||
var source pgModels.Source
|
||||
err = db.WithContext(ctx).Model(&pgModels.Source{}).Where("id = ?", userSource.SourceID).First(&source).Error
|
||||
var source models.Source
|
||||
err = db.WithContext(ctx).Model(&models.Source{}).Where("id = ?", userSource.SourceID).First(&source).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"source_id": userSource.SourceID,
|
||||
@ -157,10 +156,10 @@ func GetSpecifiedUserSourceLink(ctx context.Context, db *gorm.DB, anthroveUserID
|
||||
return nil, fmt.Errorf("anthroveUserID or sourceDisplayName is empty")
|
||||
}
|
||||
|
||||
var userSources []pgModels.UserSource
|
||||
var userSources []models.UserSource
|
||||
userSourceMap := make(map[string]graphModels.AnthroveUserRelationship)
|
||||
|
||||
err := db.WithContext(ctx).Model(&pgModels.UserSource{}).InnerJoins("Source", db.Where("display_name = ?", sourceDisplayName)).Where("user_id = ?", string(anthroveUserID)).First(&userSources).Error
|
||||
err := db.WithContext(ctx).Model(&models.UserSource{}).InnerJoins("Source", db.Where("display_name = ?", sourceDisplayName)).Where("user_id = ?", string(anthroveUserID)).First(&userSources).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
@ -170,8 +169,8 @@ func GetSpecifiedUserSourceLink(ctx context.Context, db *gorm.DB, anthroveUserID
|
||||
}
|
||||
|
||||
for _, userSource := range userSources {
|
||||
var source pgModels.Source
|
||||
err = db.WithContext(ctx).Model(&pgModels.Source{}).Where("id = ?", userSource.SourceID).First(&source).Error
|
||||
var source models.Source
|
||||
err = db.WithContext(ctx).Model(&models.Source{}).Where("id = ?", userSource.SourceID).First(&source).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"source_id": userSource.SourceID,
|
||||
@ -204,8 +203,8 @@ func GetAnthroveUser(ctx context.Context, db *gorm.DB, anthroveUserID models.Ant
|
||||
return nil, fmt.Errorf("anthroveUserID cannot be empty")
|
||||
}
|
||||
|
||||
var user pgModels.User
|
||||
var userSources []pgModels.UserSource
|
||||
var user models.User
|
||||
var userSources []models.UserSource
|
||||
anthroveUser := &graphModels.AnthroveUser{
|
||||
UserID: anthroveUserID,
|
||||
}
|
||||
@ -218,7 +217,7 @@ func GetAnthroveUser(ctx context.Context, db *gorm.DB, anthroveUserID models.Ant
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = db.WithContext(ctx).Model(&pgModels.UserSource{}).Where("user_id = ?", string(anthroveUserID)).Find(&userSources).Error
|
||||
err = db.WithContext(ctx).Model(&models.UserSource{}).Where("user_id = ?", string(anthroveUserID)).Find(&userSources).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
@ -227,8 +226,8 @@ func GetAnthroveUser(ctx context.Context, db *gorm.DB, anthroveUserID models.Ant
|
||||
}
|
||||
|
||||
for _, userSource := range userSources {
|
||||
var source pgModels.Source
|
||||
err = db.WithContext(ctx).Model(&pgModels.Source{}).Where("id = ?", userSource.SourceID).First(&source).Error
|
||||
var source models.Source
|
||||
err = db.WithContext(ctx).Model(&models.Source{}).Where("id = ?", userSource.SourceID).First(&source).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"source_id": userSource.SourceID,
|
||||
@ -255,10 +254,10 @@ func GetAnthroveUser(ctx context.Context, db *gorm.DB, anthroveUserID models.Ant
|
||||
}
|
||||
|
||||
func GetAllAnthroveUserIDs(ctx context.Context, db *gorm.DB) ([]models.AnthroveUserID, error) {
|
||||
var users []pgModels.User
|
||||
var users []models.User
|
||||
var userIDs []models.AnthroveUserID
|
||||
|
||||
err := db.WithContext(ctx).Model(&pgModels.User{}).Find(&users).Error
|
||||
err := db.WithContext(ctx).Model(&models.User{}).Find(&users).Error
|
||||
if err != nil {
|
||||
log.Error("database: failed to get all anthrove user IDs")
|
||||
return nil, err
|
||||
@ -276,10 +275,10 @@ func GetAllAnthroveUserIDs(ctx context.Context, db *gorm.DB) ([]models.AnthroveU
|
||||
}
|
||||
|
||||
func GetUserFavoriteNodeWithPagination(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID, skip int, limit int) (*graphModels.FavoriteList, error) {
|
||||
var userFavorites []pgModels.UserFavorite
|
||||
var userFavorites []models.UserFavorite
|
||||
var favoritePosts []graphModels.FavoritePost
|
||||
|
||||
err := db.WithContext(ctx).Model(&pgModels.UserFavorite{}).Where("user_id = ?", string(anthroveUserID)).Offset(skip).Limit(limit).Find(&userFavorites).Error
|
||||
err := db.WithContext(ctx).Model(&models.UserFavorite{}).Where("user_id = ?", string(anthroveUserID)).Offset(skip).Limit(limit).Find(&userFavorites).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"anthrove_user_id": anthroveUserID,
|
||||
@ -290,8 +289,8 @@ func GetUserFavoriteNodeWithPagination(ctx context.Context, db *gorm.DB, anthrov
|
||||
}
|
||||
|
||||
for _, userFavorite := range userFavorites {
|
||||
var post pgModels.Post
|
||||
err = db.WithContext(ctx).Model(&pgModels.Post{}).Where("id = ?", userFavorite.PostID).First(&post).Error
|
||||
var post models.Post
|
||||
err = db.WithContext(ctx).Model(&models.Post{}).Where("id = ?", userFavorite.PostID).First(&post).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
"post_id": userFavorite.PostID,
|
||||
@ -316,7 +315,7 @@ func GetUserFavoriteNodeWithPagination(ctx context.Context, db *gorm.DB, anthrov
|
||||
}
|
||||
|
||||
func GetUserTagNodeWitRelationToFavedPosts(ctx context.Context, db *gorm.DB, anthroveUserID models.AnthroveUserID) ([]graphModels.TagsWithFrequency, error) {
|
||||
var userFavorites []pgModels.UserFavorite
|
||||
var userFavorites []models.UserFavorite
|
||||
err := db.WithContext(ctx).Where("user_id = ?", string(anthroveUserID)).Find(&userFavorites).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
@ -330,7 +329,7 @@ func GetUserTagNodeWitRelationToFavedPosts(ctx context.Context, db *gorm.DB, ant
|
||||
typeName string
|
||||
}]int)
|
||||
for _, userFavorite := range userFavorites {
|
||||
var post pgModels.Post
|
||||
var post models.Post
|
||||
err = db.WithContext(ctx).Preload("Tags").First(&post, "id = ?", userFavorite.PostID).Error
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{
|
||||
|
@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/test"
|
||||
"gorm.io/gorm"
|
||||
"reflect"
|
||||
@ -73,7 +72,7 @@ func TestCreateUserNodeWithSourceRelation(t *testing.T) {
|
||||
|
||||
// Setup Test
|
||||
|
||||
source := &pgModels.Source{
|
||||
source := &models.Source{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
Icon: "icon.e621.net",
|
||||
@ -320,7 +319,7 @@ func TestGetSpecifiedUserSourceLink(t *testing.T) {
|
||||
defer container.Terminate(ctx)
|
||||
|
||||
// Setup Test
|
||||
source := &pgModels.Source{
|
||||
source := &models.Source{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
}
|
||||
@ -455,37 +454,37 @@ func TestGetUserFavoriteNodeWithPagination(t *testing.T) {
|
||||
PostID: models.AnthrovePostID(fmt.Sprintf("%-25s", "Post1")),
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
AnthrovePost: graphModels.AnthrovePost{
|
||||
PostID: models.AnthrovePostID(fmt.Sprintf("%-25s", "Post2")),
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
AnthrovePost: graphModels.AnthrovePost{
|
||||
PostID: models.AnthrovePostID(fmt.Sprintf("%-25s", "Post3")),
|
||||
Rating: "explicit",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
AnthrovePost: graphModels.AnthrovePost{
|
||||
PostID: models.AnthrovePostID(fmt.Sprintf("%-25s", "Post4")),
|
||||
Rating: "explicit",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
AnthrovePost: graphModels.AnthrovePost{
|
||||
PostID: models.AnthrovePostID(fmt.Sprintf("%-25s", "Post5")),
|
||||
Rating: "questionable",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
AnthrovePost: graphModels.AnthrovePost{
|
||||
PostID: models.AnthrovePostID(fmt.Sprintf("%-25s", "Post6")),
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
expectedResult := &graphModels.FavoriteList{
|
||||
Posts: expectedResultPostsGraph,
|
||||
@ -502,31 +501,31 @@ func TestGetUserFavoriteNodeWithPagination(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expectedResultPostsPg := []pgModels.Post{
|
||||
expectedResultPostsPg := []models.Post{
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post1"},
|
||||
BaseModel: models.BaseModel{ID: "Post1"},
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post2"},
|
||||
BaseModel: models.BaseModel{ID: "Post2"},
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post3"},
|
||||
BaseModel: models.BaseModel{ID: "Post3"},
|
||||
Rating: "explicit",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post4"},
|
||||
BaseModel: models.BaseModel{ID: "Post4"},
|
||||
Rating: "explicit",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post5"},
|
||||
BaseModel: models.BaseModel{ID: "Post5"},
|
||||
Rating: "questionable",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post6"},
|
||||
BaseModel: models.BaseModel{ID: "Post6"},
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, expectedResultPost := range expectedResultPostsPg {
|
||||
@ -621,31 +620,31 @@ func TestGetUserFavoritesCount(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expectedResultPostsPg := []pgModels.Post{
|
||||
expectedResultPostsPg := []models.Post{
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post1"},
|
||||
BaseModel: models.BaseModel{ID: "Post1"},
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post2"},
|
||||
BaseModel: models.BaseModel{ID: "Post2"},
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post3"},
|
||||
BaseModel: models.BaseModel{ID: "Post3"},
|
||||
Rating: "explicit",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post4"},
|
||||
BaseModel: models.BaseModel{ID: "Post4"},
|
||||
Rating: "explicit",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post5"},
|
||||
BaseModel: models.BaseModel{ID: "Post5"},
|
||||
Rating: "questionable",
|
||||
},
|
||||
},
|
||||
{
|
||||
BaseModel: pgModels.BaseModel{ID: "Post6"},
|
||||
BaseModel: models.BaseModel{ID: "Post6"},
|
||||
Rating: "safe",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, expectedResultPost := range expectedResultPostsPg {
|
||||
@ -727,7 +726,7 @@ func TestGetUserSourceLink(t *testing.T) {
|
||||
|
||||
// Setup Test
|
||||
|
||||
esource := &pgModels.Source{
|
||||
esource := &models.Source{
|
||||
DisplayName: "e621",
|
||||
Domain: "e621.net",
|
||||
}
|
||||
@ -736,7 +735,7 @@ func TestGetUserSourceLink(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
fasource := &pgModels.Source{
|
||||
fasource := &models.Source{
|
||||
DisplayName: "fa",
|
||||
Domain: "fa.net",
|
||||
}
|
||||
@ -823,10 +822,10 @@ func TestGetUserTagNodeWitRelationToFavedPosts(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
posts := []pgModels.Post{
|
||||
{BaseModel: pgModels.BaseModel{ID: fmt.Sprintf("%-25s", "Post1")}, Rating: "safe"},
|
||||
{BaseModel: pgModels.BaseModel{ID: fmt.Sprintf("%-25s", "Post2")}, Rating: "safe"},
|
||||
{BaseModel: pgModels.BaseModel{ID: fmt.Sprintf("%-25s", "Post3")}, Rating: "explicit"},
|
||||
posts := []models.Post{
|
||||
{BaseModel: models.BaseModel{ID: fmt.Sprintf("%-25s", "Post1")}, Rating: "safe"},
|
||||
{BaseModel: models.BaseModel{ID: fmt.Sprintf("%-25s", "Post2")}, Rating: "safe"},
|
||||
{BaseModel: models.BaseModel{ID: fmt.Sprintf("%-25s", "Post3")}, Rating: "explicit"},
|
||||
}
|
||||
|
||||
for _, post := range posts {
|
||||
@ -840,7 +839,7 @@ func TestGetUserTagNodeWitRelationToFavedPosts(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
tags := []pgModels.Tag{
|
||||
tags := []models.Tag{
|
||||
{Name: "JayTheFerret", Type: "artist"},
|
||||
{Name: "Ferret", Type: "species"},
|
||||
{Name: "Jay", Type: "character"},
|
||||
|
@ -1,60 +0,0 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/pgModels"
|
||||
)
|
||||
|
||||
// GraphConvertSource converts a graphModels.AnthroveSource to a pgModels.Source
|
||||
func GraphConvertSource(graphSource *graphModels.AnthroveSource) *pgModels.Source {
|
||||
pgSource := &pgModels.Source{
|
||||
DisplayName: graphSource.DisplayName,
|
||||
Domain: graphSource.Domain,
|
||||
Icon: graphSource.Icon,
|
||||
}
|
||||
return pgSource
|
||||
}
|
||||
|
||||
// PostgresConvertToAnthroveSource converts a pgModels.Source to a graphModels.AnthroveSource
|
||||
func PostgresConvertToAnthroveSource(pgSource *pgModels.Source) *graphModels.AnthroveSource {
|
||||
graphSource := &graphModels.AnthroveSource{
|
||||
DisplayName: pgSource.DisplayName,
|
||||
Domain: pgSource.Domain,
|
||||
Icon: pgSource.Icon,
|
||||
}
|
||||
|
||||
return graphSource
|
||||
}
|
||||
|
||||
// GraphConvertTag converts a graphModels.AnthroveTag to a pgModels.Tag
|
||||
func GraphConvertTag(graphTag *graphModels.AnthroveTag) *pgModels.Tag {
|
||||
pgTag := &pgModels.Tag{
|
||||
Name: graphTag.Name,
|
||||
Type: models.TagType(graphTag.Type),
|
||||
}
|
||||
return pgTag
|
||||
}
|
||||
|
||||
// PostgresConvertToAnthroveTag converts a pgModels.Tag to a graphModels.AnthroveTag
|
||||
func PostgresConvertToAnthroveTag(pgTag *pgModels.Tag) *graphModels.AnthroveTag {
|
||||
graphTag := &graphModels.AnthroveTag{
|
||||
Name: pgTag.Name,
|
||||
Type: string(pgTag.Type),
|
||||
}
|
||||
|
||||
return graphTag
|
||||
}
|
||||
|
||||
func ConvertToTagsWithFrequency(tags []pgModels.Tag) []graphModels.TagsWithFrequency {
|
||||
var tagsWithFrequency []graphModels.TagsWithFrequency
|
||||
for _, tag := range tags {
|
||||
graphTag := PostgresConvertToAnthroveTag(&tag)
|
||||
tagsWithFrequency = append(tagsWithFrequency, graphModels.TagsWithFrequency{
|
||||
Frequency: 0,
|
||||
Tags: *graphTag,
|
||||
})
|
||||
}
|
||||
|
||||
return tagsWithFrequency
|
||||
}
|
@ -1,34 +1,8 @@
|
||||
// Package database provides a client for using the OtterSpace API.
|
||||
//
|
||||
// This package provides a client to interact with the OtterSpace API. It includes
|
||||
// methods for all API endpoints, and convenience methods for common tasks.
|
||||
//
|
||||
// This is a simple usage example:
|
||||
//
|
||||
// package main
|
||||
//
|
||||
// import (
|
||||
// "context"
|
||||
// "fmt"
|
||||
// "git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
// "git.dragse.it/anthrove/otter-space-sdk/pkg/database"
|
||||
// )
|
||||
//
|
||||
// func main() {
|
||||
// client := database.NewGraphConnection()
|
||||
// err := client.Connect(context.Background(), "your-endpoint", "your-username", "your-password")
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// return
|
||||
// }
|
||||
// // further usage of the client...
|
||||
// }
|
||||
package database
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
)
|
||||
|
||||
// OtterSpace provides an interface for interacting with the OtterSpace API.
|
||||
@ -45,23 +19,23 @@ type OtterSpace interface {
|
||||
|
||||
// AddSource adds a new source to the OtterSpace database.
|
||||
// It returns an error if the operation fails.
|
||||
AddSource(ctx context.Context, anthroveSource *graphModels.AnthroveSource) error
|
||||
AddSource(ctx context.Context, anthroveSource *models.Source) error
|
||||
|
||||
// AddPost adds a new post to the OtterSpace database.
|
||||
// It returns an error if the operation fails.
|
||||
AddPost(ctx context.Context, anthrovePost *graphModels.AnthrovePost) error
|
||||
AddPost(ctx context.Context, anthrovePost *models.Post) error
|
||||
|
||||
// AddTagWithRelationToPost adds a new tag to the OtterSpace database and associates it with a post.
|
||||
// It returns an error if the operation fails.
|
||||
AddTagWithRelationToPost(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *graphModels.AnthroveTag) error
|
||||
AddTagWithRelationToPost(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *models.Tag) error
|
||||
|
||||
// LinkPostWithSource establishes a link between a post and a source in the OtterSpace database.
|
||||
// It returns an error if the operation fails.
|
||||
LinkPostWithSource(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *graphModels.AnthrovePostRelationship) error
|
||||
LinkPostWithSource(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *models.PostReference) error
|
||||
|
||||
// LinkUserWithPost establishes a link between a user and a post in the OtterSpace database.
|
||||
// It returns an error if the operation fails.
|
||||
LinkUserWithPost(ctx context.Context, anthroveUser *graphModels.AnthroveUser, anthrovePost *graphModels.AnthrovePost) error
|
||||
LinkUserWithPost(ctx context.Context, anthroveUser *models.User, anthrovePost *models.Post) error
|
||||
|
||||
// CheckUserPostLink checks if a link between a user and a post exists in the OtterSpace database.
|
||||
// It returns true if the link exists, false otherwise, and an error if the operation fails.
|
||||
@ -69,15 +43,15 @@ type OtterSpace interface {
|
||||
|
||||
// CheckPostNodeExistsByAnthroveID checks if a post node exists in the OtterSpace database by its Anthrove ID.
|
||||
// It returns the post if it exists, a boolean indicating whether the post was found, and an error if the operation fails.
|
||||
CheckPostNodeExistsByAnthroveID(ctx context.Context, anthrovePost *graphModels.AnthrovePost) (*graphModels.AnthrovePost, bool, error)
|
||||
CheckPostNodeExistsByAnthroveID(ctx context.Context, anthrovePost *models.Post) (*models.Post, bool, error)
|
||||
|
||||
// CheckPostNodeExistsBySourceURL checks if a post node exists in the OtterSpace database by its source URL.
|
||||
// It returns the post if it exists, a boolean indicating whether the post was found, and an error if the operation fails.
|
||||
CheckPostNodeExistsBySourceURL(ctx context.Context, sourceUrl string) (*graphModels.AnthrovePost, bool, error)
|
||||
CheckPostNodeExistsBySourceURL(ctx context.Context, sourceUrl string) (*models.Post, bool, error)
|
||||
|
||||
// CheckPostNodeExistsBySourceID checks if a post node exists in the OtterSpace database by its source ID.
|
||||
// It returns the post if it exists, a boolean indicating whether the post was found, and an error if the operation fails.
|
||||
CheckPostNodeExistsBySourceID(ctx context.Context, sourcePostID string) (*graphModels.AnthrovePost, bool, error)
|
||||
CheckPostNodeExistsBySourceID(ctx context.Context, sourcePostID string) (*models.Post, bool, error)
|
||||
|
||||
// GetUserFavoriteCount retrieves the count of a user's favorite posts from the OtterSpace database.
|
||||
// It returns the count and an error if the operation fails.
|
||||
@ -85,32 +59,32 @@ type OtterSpace interface {
|
||||
|
||||
// GetUserSourceLinks retrieves the links between a user and sources in the OtterSpace database.
|
||||
// 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]graphModels.AnthroveUserRelationship, error)
|
||||
GetUserSourceLinks(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]models.UserSource, error)
|
||||
|
||||
// GetSpecifiedUserSourceLink GetUserSourceLinks retrieves the links between a user and a specific source in the OtterSpace database.
|
||||
// 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]graphModels.AnthroveUserRelationship, error)
|
||||
GetSpecifiedUserSourceLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]models.UserSource, error)
|
||||
|
||||
// GetAnthroveUser retrieves a user from the OtterSpace database by their ID.
|
||||
// It returns the user and an error if the operation fails.
|
||||
GetAnthroveUser(ctx context.Context, anthroveUserID models.AnthroveUserID) (*graphModels.AnthroveUser, error)
|
||||
GetAnthroveUser(ctx context.Context, anthroveUserID models.AnthroveUserID) (*models.User, error)
|
||||
|
||||
// GetAllAnthroveUserIDs retrieves all user IDs from the OtterSpace database.
|
||||
// It returns a slice of user IDs and an error if the operation fails.
|
||||
GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, 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) (*graphModels.FavoriteList, error)
|
||||
GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*models.FavoriteList, error)
|
||||
|
||||
// GetUserTagsTroughFavedPosts returns a list of Tags that the user hs favorites through a post
|
||||
GetUserTagsTroughFavedPosts(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]graphModels.TagsWithFrequency, error)
|
||||
GetUserTagsTroughFavedPosts(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]models.TagsWithFrequency, error)
|
||||
|
||||
// GetAllTags returns a list of Tags that the user hs favorites through a post
|
||||
GetAllTags(ctx context.Context) ([]graphModels.TagsWithFrequency, error)
|
||||
GetAllTags(ctx context.Context) ([]models.TagsWithFrequency, error)
|
||||
|
||||
// GetAllSources returns a list of Sources in the database
|
||||
GetAllSources(ctx context.Context) ([]graphModels.AnthroveSource, error)
|
||||
GetAllSources(ctx context.Context) ([]models.Source, error)
|
||||
|
||||
// GetSourceByURL returns the Source Node based on the URL
|
||||
GetSourceByURL(ctx context.Context, sourceUrl string) (*graphModels.AnthroveSource, error)
|
||||
GetSourceByURL(ctx context.Context, sourceUrl string) (*models.Source, error)
|
||||
}
|
||||
|
@ -1,123 +0,0 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/internal/graph"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models/graphModels"
|
||||
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
|
||||
"github.com/neo4j/neo4j-go-driver/v5/neo4j/config"
|
||||
)
|
||||
|
||||
type graphConnection struct {
|
||||
driver neo4j.DriverWithContext
|
||||
graphDebug bool
|
||||
}
|
||||
|
||||
func NewGraphConnection(graphDebug bool) OtterSpace {
|
||||
return &graphConnection{
|
||||
driver: nil,
|
||||
graphDebug: graphDebug,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *graphConnection) Connect(ctx context.Context, endpoint string, username string, password string, _ string, _ int, _ string, _ string) error {
|
||||
driver, err := neo4j.NewDriverWithContext(endpoint, neo4j.BasicAuth(username, password, ""),
|
||||
logger(g.graphDebug))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = driver.VerifyAuthentication(ctx, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
g.driver = driver
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *graphConnection) AddUserWithRelationToSource(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDomain string, userID string, username string) error {
|
||||
return graph.CreateUserNodeWithSourceRelation(ctx, g.driver, anthroveUserID, sourceDomain, userID, username)
|
||||
}
|
||||
|
||||
func (g *graphConnection) AddSource(ctx context.Context, anthroveSource *graphModels.AnthroveSource) error {
|
||||
return graph.CreateSourceNode(ctx, g.driver, anthroveSource)
|
||||
}
|
||||
|
||||
func (g *graphConnection) AddPost(ctx context.Context, anthrovePost *graphModels.AnthrovePost) error {
|
||||
return graph.CreateAnthrovePostNode(ctx, g.driver, anthrovePost)
|
||||
}
|
||||
|
||||
func (g *graphConnection) AddTagWithRelationToPost(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *graphModels.AnthroveTag) error {
|
||||
return graph.CreateTagNodeWitRelation(ctx, g.driver, anthrovePostID, anthroveTag)
|
||||
}
|
||||
|
||||
func (g *graphConnection) LinkPostWithSource(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *graphModels.AnthrovePostRelationship) error {
|
||||
return graph.EstablishAnthrovePostToSourceLink(ctx, g.driver, anthrovePostID, anthroveSourceDomain, anthrovePostRelationship)
|
||||
}
|
||||
|
||||
func (g *graphConnection) LinkUserWithPost(ctx context.Context, anthroveUser *graphModels.AnthroveUser, anthrovePost *graphModels.AnthrovePost) error {
|
||||
return graph.EstablishUserToPostLink(ctx, g.driver, anthroveUser, anthrovePost)
|
||||
}
|
||||
|
||||
func (g *graphConnection) CheckUserPostLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourcePostID string, sourceUrl string) (bool, error) {
|
||||
return graph.CheckUserToPostLink(ctx, g.driver, anthroveUserID, sourcePostID, sourceUrl)
|
||||
}
|
||||
|
||||
func (g *graphConnection) CheckPostNodeExistsByAnthroveID(ctx context.Context, anthrovePost *graphModels.AnthrovePost) (*graphModels.AnthrovePost, bool, error) {
|
||||
return graph.CheckIfAnthrovePostNodeExistsByAnthroveID(ctx, g.driver, anthrovePost)
|
||||
}
|
||||
|
||||
func (g *graphConnection) CheckPostNodeExistsBySourceURL(ctx context.Context, sourceUrl string) (*graphModels.AnthrovePost, bool, error) {
|
||||
return graph.CheckIfAnthrovePostNodeExistsBySourceURl(ctx, g.driver, sourceUrl)
|
||||
}
|
||||
|
||||
func (g *graphConnection) CheckPostNodeExistsBySourceID(ctx context.Context, sourcePostID string) (*graphModels.AnthrovePost, bool, error) {
|
||||
return graph.CheckIfAnthrovePostNodeExistsBySourceID(ctx, g.driver, sourcePostID)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetUserFavoriteCount(ctx context.Context, anthroveUserID models.AnthroveUserID) (int64, error) {
|
||||
return graph.GetUserFavoritesCount(ctx, g.driver, anthroveUserID)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetUserSourceLinks(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]graphModels.AnthroveUserRelationship, error) {
|
||||
return graph.GetUserSourceLink(ctx, g.driver, anthroveUserID)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetSpecifiedUserSourceLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]graphModels.AnthroveUserRelationship, error) {
|
||||
return graph.GetSpecifiedUserSourceLink(ctx, g.driver, anthroveUserID, sourceDisplayName)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetAnthroveUser(ctx context.Context, anthroveUserID models.AnthroveUserID) (*graphModels.AnthroveUser, error) {
|
||||
return graph.GetAnthroveUser(ctx, g.driver, anthroveUserID)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, error) {
|
||||
return graph.GetAllAnthroveUserIDs(ctx, g.driver)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*graphModels.FavoriteList, error) {
|
||||
return graph.GetUserFavoriteNodeWithPagination(ctx, g.driver, anthroveUserID, skip, limit)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetUserTagsTroughFavedPosts(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]graphModels.TagsWithFrequency, error) {
|
||||
return graph.GetUserTagNodeWitRelationToFavedPosts(ctx, g.driver, anthroveUserID)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetAllTags(ctx context.Context) ([]graphModels.TagsWithFrequency, error) {
|
||||
return graph.GetTags(ctx, g.driver)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetAllSources(ctx context.Context) ([]graphModels.AnthroveSource, error) {
|
||||
return graph.GetAllSourceNodes(ctx, g.driver)
|
||||
}
|
||||
|
||||
func (g *graphConnection) GetSourceByURL(ctx context.Context, sourceUrl string) (*graphModels.AnthroveSource, error) {
|
||||
return graph.GetSourceNodesByURL(ctx, g.driver, sourceUrl)
|
||||
}
|
||||
|
||||
func logger(graphDebug bool) func(config *config.Config) {
|
||||
return func(config *config.Config) {
|
||||
config.Log = graph.NewGraphLogger(graphDebug)
|
||||
}
|
||||
}
|
@ -89,10 +89,10 @@ CREATE TABLE "UserFavorites"
|
||||
|
||||
CREATE TABLE "UserSource"
|
||||
(
|
||||
user_id TEXT REFERENCES "User" (id),
|
||||
source_id TEXT REFERENCES "Source" (id),
|
||||
account_username TEXT,
|
||||
account_id TEXT,
|
||||
user_id TEXT REFERENCES "User" (id),
|
||||
source_id TEXT REFERENCES "Source" (id),
|
||||
scrape_time_interval TEXT account_username TEXT,
|
||||
account_id TEXT,
|
||||
PRIMARY KEY (user_id, source_id),
|
||||
UNIQUE (account_username, account_id)
|
||||
);
|
||||
|
@ -1,84 +0,0 @@
|
||||
# Postgres
|
||||
|
||||
https://www.dbdiagram.io/d
|
||||
|
||||
````
|
||||
Table User {
|
||||
id string [primary key]
|
||||
created_at timestamp
|
||||
}
|
||||
|
||||
Table Post {
|
||||
id varchar(25) [primary key]
|
||||
rating Rating
|
||||
created_at timestamp
|
||||
}
|
||||
|
||||
Enum Rating {
|
||||
safe
|
||||
questionable
|
||||
explicit
|
||||
}
|
||||
|
||||
Table Source {
|
||||
id varchar(25) [primary key]
|
||||
display_name text
|
||||
domain text [not null, unique]
|
||||
}
|
||||
|
||||
Table Tag {
|
||||
name text [primary key]
|
||||
type TagType
|
||||
}
|
||||
|
||||
Enum TagType {
|
||||
general
|
||||
species
|
||||
character
|
||||
artist
|
||||
lore
|
||||
meta
|
||||
invalid
|
||||
}
|
||||
|
||||
Table TagAlias {
|
||||
name text [primary key]
|
||||
tag_id text
|
||||
}
|
||||
|
||||
Table TagGroup {
|
||||
name text [primary key]
|
||||
tag_id text
|
||||
}
|
||||
|
||||
Table UserFavorites {
|
||||
user_id text [primary key]
|
||||
post_id text [primary key]
|
||||
created_at timestamp
|
||||
}
|
||||
|
||||
Table UserSource {
|
||||
user_id text [primary key]
|
||||
source_id text [primary key]
|
||||
account_username text
|
||||
account_id text
|
||||
}
|
||||
|
||||
Table PostReference {
|
||||
post_id text [primary key]
|
||||
source_id text [primary key]
|
||||
url text [not null, unique]
|
||||
source_post_id text
|
||||
}
|
||||
|
||||
Ref: Tag.name > TagAlias.tag_id
|
||||
Ref: Tag.name > TagGroup.tag_id
|
||||
Ref: Tag.name <> Post.id
|
||||
Ref: UserFavorites.user_id > User.id
|
||||
Ref: UserFavorites.post_id > Post.id
|
||||
Ref: UserSource.user_id > User.id
|
||||
Ref: UserSource.source_id > Source.id
|
||||
Ref: PostReference.post_id > Post.id
|
||||
Ref: PostReference.source_id > Source.id
|
||||
|
||||
````
|
@ -1,4 +1,4 @@
|
||||
package pgModels
|
||||
package models
|
||||
|
||||
import (
|
||||
gonanoid "github.com/matoous/go-nanoid/v2"
|
@ -1,13 +0,0 @@
|
||||
package pgModels
|
||||
|
||||
type UserSource struct {
|
||||
UserID string `gorm:"primaryKey"`
|
||||
Source Source `gorm:"foreignKey:ID;references:SourceID"`
|
||||
SourceID string `gorm:"primaryKey"`
|
||||
AccountUsername string
|
||||
AccountID string
|
||||
}
|
||||
|
||||
func (UserSource) TableName() string {
|
||||
return "UserSource"
|
||||
}
|
@ -1,13 +1,9 @@
|
||||
package pgModels
|
||||
|
||||
import (
|
||||
"git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
)
|
||||
package models
|
||||
|
||||
// Post model
|
||||
type Post struct {
|
||||
BaseModel
|
||||
Rating models.Rating `gorm:"type:enum('safe','questionable','explicit')"`
|
||||
Rating Rating `gorm:"type:enum('safe','questionable','explicit')"`
|
||||
Tags []Tag `gorm:"many2many:post_tags;"`
|
||||
Favorites []UserFavorite `gorm:"foreignKey:PostID"`
|
||||
References []PostReference `gorm:"foreignKey:PostID"`
|
@ -1,4 +1,4 @@
|
||||
package pgModels
|
||||
package models
|
||||
|
||||
type PostReference struct {
|
||||
PostID string `gorm:"primaryKey"`
|
@ -1,4 +1,4 @@
|
||||
package pgModels
|
||||
package models
|
||||
|
||||
// Source model
|
||||
type Source struct {
|
@ -1,14 +1,12 @@
|
||||
package pgModels
|
||||
|
||||
import "git.dragse.it/anthrove/otter-space-sdk/pkg/models"
|
||||
package models
|
||||
|
||||
// Tag models
|
||||
type Tag struct {
|
||||
Name string `gorm:"primaryKey"`
|
||||
Type models.TagType `gorm:"column:tag_type"`
|
||||
Aliases []TagAlias `gorm:"foreignKey:TagID"`
|
||||
Groups []TagGroup `gorm:"foreignKey:TagID"`
|
||||
Posts []Post `gorm:"many2many:post_tags;"`
|
||||
Name string `gorm:"primaryKey"`
|
||||
Type TagType `gorm:"column:tag_type"`
|
||||
Aliases []TagAlias `gorm:"foreignKey:TagID"`
|
||||
Groups []TagGroup `gorm:"foreignKey:TagID"`
|
||||
Posts []Post `gorm:"many2many:post_tags;"`
|
||||
}
|
||||
|
||||
func (Tag) TableName() string {
|
||||
@ -34,3 +32,8 @@ type TagGroup struct {
|
||||
func (TagGroup) TableName() string {
|
||||
return "TagGroup"
|
||||
}
|
||||
|
||||
type TagsWithFrequency struct {
|
||||
Frequency int64 `json:"frequency"`
|
||||
Tags Tag `json:"tags"`
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package pgModels
|
||||
package models
|
||||
|
||||
// User model
|
||||
type User struct {
|
@ -1,4 +1,4 @@
|
||||
package pgModels
|
||||
package models
|
||||
|
||||
import "time"
|
||||
|
||||
@ -11,3 +11,7 @@ type UserFavorite struct {
|
||||
func (UserFavorite) TableName() string {
|
||||
return "UserFavorites"
|
||||
}
|
||||
|
||||
type FavoriteList struct {
|
||||
Posts []UserFavorite `json:"posts,omitempty"`
|
||||
}
|
14
pkg/models/userSource.go
Normal file
14
pkg/models/userSource.go
Normal file
@ -0,0 +1,14 @@
|
||||
package models
|
||||
|
||||
type UserSource struct {
|
||||
UserID string `gorm:"primaryKey"`
|
||||
Source Source `gorm:"foreignKey:ID;references:SourceID"`
|
||||
SourceID string `gorm:"primaryKey"`
|
||||
ScrapeTimeInterval string
|
||||
AccountUsername string
|
||||
AccountID string
|
||||
}
|
||||
|
||||
func (UserSource) TableName() string {
|
||||
return "UserSource"
|
||||
}
|
Reference in New Issue
Block a user