diff --git a/internal/postgres/source.go b/internal/postgres/source.go index 956c53b..3d2cdca 100644 --- a/internal/postgres/source.go +++ b/internal/postgres/source.go @@ -2,14 +2,33 @@ package postgres import ( "context" - "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" ) -// GetAllSourceNodes returns a list of all models.AnthroveSource -func GetAllSourceNodes(ctx context.Context, db *gorm.DB) ([]graphModels.AnthroveSource, error) { - var sources []graphModels.AnthroveSource +// CreateSourceNode creates a pgModels.Source +func CreateSourceNode(ctx context.Context, db *gorm.DB, anthroveSource *pgModels.Source) error { + + result := db.WithContext(ctx).Create(anthroveSource) + + if result.Error != nil { + return result.Error + } + + 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 +} + +// GetAllSourceNodes returns a list of all pgModels.Source +func GetAllSourceNodes(ctx context.Context, db *gorm.DB) ([]pgModels.Source, error) { + var sources []pgModels.Source result := db.WithContext(ctx).Find(&sources) @@ -23,3 +42,21 @@ func GetAllSourceNodes(ctx context.Context, db *gorm.DB) ([]graphModels.Anthrove return sources, nil } + +// 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 + + result := db.WithContext(ctx).Where("domain = ?", domain).First(&sources) + + if result.Error != nil { + return nil, result.Error + } + + log.WithFields(log.Fields{ + "tag_amount": result.RowsAffected, + }).Trace("database: get all source nodes") + + return sources, nil +} diff --git a/internal/utils/modelConvert.go b/internal/utils/modelConvert.go new file mode 100644 index 0000000..cc75258 --- /dev/null +++ b/internal/utils/modelConvert.go @@ -0,0 +1,27 @@ +package utils + +import ( + "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 +} diff --git a/pkg/database/migrations/001_inital_database.sql b/pkg/database/migrations/001_inital_database.sql index a3c1146..00fcf9c 100644 --- a/pkg/database/migrations/001_inital_database.sql +++ b/pkg/database/migrations/001_inital_database.sql @@ -1,3 +1,9 @@ +-- TODO: Add the following fields where its defined in the model +-- created_at +-- updated_at +-- deleted_at + + -- +migrate Up CREATE TYPE Rating AS ENUM ( 'safe', @@ -24,8 +30,9 @@ CREATE TABLE "Post" CREATE TABLE "Source" ( - id VARCHAR(25) UNIQUE PRIMARY KEY, + id VARCHAR(25) UNIQUE PRIMARY KEY, display_name TEXT, + icon TEXT, domain TEXT NOT NULL UNIQUE ); diff --git a/pkg/database/postgres.go b/pkg/database/postgres.go index 7680441..5ed0afe 100644 --- a/pkg/database/postgres.go +++ b/pkg/database/postgres.go @@ -7,6 +7,7 @@ import ( "fmt" "git.dragse.it/anthrove/otter-space-sdk/internal/postgres" + "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/lib/pq" @@ -29,7 +30,7 @@ func NewPostgresqlConnection() OtterSpace { } } -func (p postgresqlConnection) Connect(_ context.Context, endpoint string, username string, password string, database string, port int, ssl string, timezone string) error { +func (p *postgresqlConnection) Connect(_ context.Context, endpoint string, username string, password string, database string, port int, ssl string, timezone string) error { dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=%s", endpoint, username, password, database, port, ssl, timezone) var err error @@ -40,7 +41,8 @@ func (p postgresqlConnection) Connect(_ context.Context, endpoint string, userna log.Infof("OtterSpace: migration compleate") - p.db, err = gorm.Open(gormPostgres.Open(dsn), &gorm.Config{}) + db, err := gorm.Open(gormPostgres.Open(dsn), &gorm.Config{}) + p.db = db if err != nil { return err } @@ -50,106 +52,113 @@ func (p postgresqlConnection) Connect(_ context.Context, endpoint string, userna return nil } -func (p postgresqlConnection) AddUserWithRelationToSource(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDomain string, userID string, username string) error { +func (p *postgresqlConnection) AddUserWithRelationToSource(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDomain string, userID string, username string) error { //TODO implement me panic("implement me") } -func (p postgresqlConnection) AddSource(ctx context.Context, anthroveSource *graphModels.AnthroveSource) error { +func (p *postgresqlConnection) AddSource(ctx context.Context, anthroveSource *graphModels.AnthroveSource) error { + source := utils.GraphConvertSource(anthroveSource) + return postgres.CreateSourceNode(ctx, p.db, source) +} + +func (p *postgresqlConnection) AddPost(ctx context.Context, anthrovePost *graphModels.AnthrovePost) error { //TODO implement me panic("implement me") } -func (p postgresqlConnection) AddPost(ctx context.Context, anthrovePost *graphModels.AnthrovePost) error { +func (p *postgresqlConnection) AddTagWithRelationToPost(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *graphModels.AnthroveTag) error { //TODO implement me panic("implement me") } -func (p postgresqlConnection) AddTagWithRelationToPost(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveTag *graphModels.AnthroveTag) error { +func (p *postgresqlConnection) LinkPostWithSource(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *graphModels.AnthrovePostRelationship) error { //TODO implement me panic("implement me") } -func (p postgresqlConnection) LinkPostWithSource(ctx context.Context, anthrovePostID models.AnthrovePostID, anthroveSourceDomain string, anthrovePostRelationship *graphModels.AnthrovePostRelationship) error { +func (p *postgresqlConnection) LinkUserWithPost(ctx context.Context, anthroveUser *graphModels.AnthroveUser, anthrovePost *graphModels.AnthrovePost) error { //TODO implement me panic("implement me") } -func (p postgresqlConnection) LinkUserWithPost(ctx context.Context, anthroveUser *graphModels.AnthroveUser, anthrovePost *graphModels.AnthrovePost) error { +func (p *postgresqlConnection) CheckUserPostLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourcePostID string, sourceUrl string) (bool, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) CheckUserPostLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourcePostID string, sourceUrl string) (bool, error) { +func (p *postgresqlConnection) CheckPostNodeExistsByAnthroveID(ctx context.Context, anthrovePost *graphModels.AnthrovePost) (*graphModels.AnthrovePost, bool, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) CheckPostNodeExistsByAnthroveID(ctx context.Context, anthrovePost *graphModels.AnthrovePost) (*graphModels.AnthrovePost, bool, error) { +func (p *postgresqlConnection) CheckPostNodeExistsBySourceURL(ctx context.Context, sourceUrl string) (*graphModels.AnthrovePost, bool, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) CheckPostNodeExistsBySourceURL(ctx context.Context, sourceUrl string) (*graphModels.AnthrovePost, bool, error) { +func (p *postgresqlConnection) CheckPostNodeExistsBySourceID(ctx context.Context, sourcePostID string) (*graphModels.AnthrovePost, bool, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) CheckPostNodeExistsBySourceID(ctx context.Context, sourcePostID string) (*graphModels.AnthrovePost, bool, error) { +func (p *postgresqlConnection) GetUserFavoriteCount(ctx context.Context, anthroveUserID models.AnthroveUserID) (int64, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetUserFavoriteCount(ctx context.Context, anthroveUserID models.AnthroveUserID) (int64, error) { +func (p *postgresqlConnection) GetUserSourceLinks(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]graphModels.AnthroveUserRelationship, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetUserSourceLinks(ctx context.Context, anthroveUserID models.AnthroveUserID) (map[string]graphModels.AnthroveUserRelationship, error) { +func (p *postgresqlConnection) GetSpecifiedUserSourceLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]graphModels.AnthroveUserRelationship, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetSpecifiedUserSourceLink(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceDisplayName string) (map[string]graphModels.AnthroveUserRelationship, error) { +func (p *postgresqlConnection) GetAnthroveUser(ctx context.Context, anthroveUserID models.AnthroveUserID) (*graphModels.AnthroveUser, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetAnthroveUser(ctx context.Context, anthroveUserID models.AnthroveUserID) (*graphModels.AnthroveUser, error) { +func (p *postgresqlConnection) GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetAllAnthroveUserIDs(ctx context.Context) ([]models.AnthroveUserID, error) { +func (p *postgresqlConnection) GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*graphModels.FavoriteList, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetUserFavoritePostsWithPagination(ctx context.Context, anthroveUserID models.AnthroveUserID, skip int, limit int) (*graphModels.FavoriteList, error) { +func (p *postgresqlConnection) GetUserTagsTroughFavedPosts(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]graphModels.TagsWithFrequency, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetUserTagsTroughFavedPosts(ctx context.Context, anthroveUserID models.AnthroveUserID) ([]graphModels.TagsWithFrequency, error) { +func (p *postgresqlConnection) GetAllTags(ctx context.Context) ([]graphModels.TagsWithFrequency, error) { //TODO implement me panic("implement me") } -func (p postgresqlConnection) GetAllTags(ctx context.Context) ([]graphModels.TagsWithFrequency, error) { - //TODO implement me - panic("implement me") +func (p *postgresqlConnection) GetAllSources(ctx context.Context) ([]graphModels.AnthroveSource, error) { + var anthroveSources []graphModels.AnthroveSource + source, err := postgres.GetAllSourceNodes(ctx, p.db) + + for _, v := range source { + anthroveSource := utils.PostgresConvertToAnthroveSource(&v) + anthroveSources = append(anthroveSources, *anthroveSource) + } + return nil, err } -func (p postgresqlConnection) GetAllSources(ctx context.Context) ([]graphModels.AnthroveSource, error) { - return postgres.GetAllSourceNodes(ctx, p.db) +func (p *postgresqlConnection) GetSourceByURL(ctx context.Context, sourceUrl string) (*graphModels.AnthroveSource, error) { + source, err := postgres.GetSourceNodesByURL(ctx, p.db, sourceUrl) + return utils.PostgresConvertToAnthroveSource(source), err } -func (p postgresqlConnection) GetSourceByURL(ctx context.Context, sourceUrl string) (*graphModels.AnthroveSource, error) { - //TODO implement me - panic("implement me") -} - -func (p postgresqlConnection) migrateDatabase(connectionString string) error { +func (p *postgresqlConnection) migrateDatabase(connectionString string) error { dialect := "postgres" migrations := &migrate.EmbedFileSystemMigrationSource{FileSystem: embedMigrations, Root: "migrations"} diff --git a/pkg/models/pgModels/source.go b/pkg/models/pgModels/source.go index 22c727f..7159ea5 100644 --- a/pkg/models/pgModels/source.go +++ b/pkg/models/pgModels/source.go @@ -5,6 +5,11 @@ type Source struct { BaseModel DisplayName string Domain string `gorm:"not null;unique"` + Icon string `gorm:"not null"` UserSources []UserSource `gorm:"foreignKey:SourceID"` References []PostReference `gorm:"foreignKey:SourceID"` } + +func (Source) TableName() string { + return "Source" +}