Add notification data
Some checks are pending
/ test (push) Waiting to run

This commit is contained in:
Melody Becker 2025-04-04 11:26:03 +02:00
parent 500bf48295
commit f3a139b809
Signed by: mstar
SSH key fingerprint: SHA256:9VAo09aaVNTWKzPW7Hq2LW+ox9OdwmTSHRoD4mlz1yI
6 changed files with 103 additions and 34 deletions

View file

@ -18,14 +18,6 @@ import (
"git.mstar.dev/mstar/linstrom/storage-new/models" "git.mstar.dev/mstar/linstrom/storage-new/models"
) )
// "git.mstar.dev/mstar/linstrom/config"
// "context"
// "time"
// postgresContainer "github.com/testcontainers/testcontainers-go/modules/postgres"
// "github.com/testcontainers/testcontainers-go"
// "github.com/testcontainers/testcontainers-go/wait"
const ( const (
dbName = "linstrom" dbName = "linstrom"
dbUser = "linstrom" dbUser = "linstrom"
@ -38,31 +30,6 @@ func main() {
other.ConfigureLogging(nil) other.ConfigureLogging(nil)
config.ReadAndWriteToGlobal(*shared.FlagConfigFile) config.ReadAndWriteToGlobal(*shared.FlagConfigFile)
// Set up a temporary postgres container for gorm-gen to do its thing
// log.Info().Msg("Starting temporary postgres container")
// pgContainer, err := postgresContainer.Run(
// context.Background(),
// "postgres:16.4-alpine",
// postgresContainer.WithDatabase(dbName),
// postgresContainer.WithUsername(dbUser),
// postgresContainer.WithPassword(dbPass),
// testcontainers.WithWaitStrategyAndDeadline(
// time.Minute,
// wait.ForLog("database system is ready to accept connections").
// WithOccurrence(2).
// WithStartupTimeout(time.Second*5),
// ),
// )
// if err != nil {
// log.Fatal().Err(err).Msg("Failed to setup temporary postgres container")
// }
// log.Info().Msg("Temporary postgres container started")
// defer func() {
// if err := testcontainers.TerminateContainer(pgContainer); err != nil {
// log.Fatal().Err(err).Msg("Failed to terminate temporary postgres container")
// }
// log.Info().Msg("Temporary postgres container stopped")
// }()
db, err := gorm.Open( db, err := gorm.Open(
postgres.Open(config.GlobalConfig.Storage.BuildPostgresDSN()), postgres.Open(config.GlobalConfig.Storage.BuildPostgresDSN()),
// postgres.Open(pgContainer.MustConnectionString(context.Background())), // postgres.Open(pgContainer.MustConnectionString(context.Background())),
@ -84,7 +51,10 @@ func main() {
log.Info().Msg("Applying basic operations on all datatypes") log.Info().Msg("Applying basic operations on all datatypes")
g.ApplyBasic(models.AllTypes...) g.ApplyBasic(models.AllTypes...)
log.Info().Msg("Starting generation") log.Info().Msg("Basic operations applied, applying extra features")
g.ApplyInterface(func(models.INotification) {}, models.Notification{})
log.Info().Msg("Extra features applied, starting generation")
g.Execute() g.Execute()
log.Info().Msg("Code generation complete") log.Info().Msg("Code generation complete")
} }

View file

@ -7,10 +7,12 @@ var AllTypes = []any{
&MediaMetadata{}, &MediaMetadata{},
&Note{}, &Note{},
&NoteToAttachment{}, &NoteToAttachment{},
&NoteToBoost{},
&NoteToEmote{}, &NoteToEmote{},
&NoteToFeed{}, &NoteToFeed{},
&NoteToPing{}, &NoteToPing{},
&NoteTag{}, &NoteTag{},
&Notification{},
&Reaction{}, &Reaction{},
&RemoteServer{}, &RemoteServer{},
&Role{}, &Role{},

View file

@ -0,0 +1,13 @@
package models
import "time"
// Describes a user boosting one note
type NoteToBoost struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
User User
UserId string
Note Note
NoteId string
}

View file

@ -0,0 +1,41 @@
package models
import (
"database/sql"
"gorm.io/gen"
"gorm.io/gorm"
)
// Notifications inform users of inbound events
// happening to their content
type Notification struct {
gorm.Model
ForUser User // The user the notification is for
ForUserId string
SourceNote *Note // The note where the notification originates from
SourceNoteId sql.NullString
SourceUser *User // The user causing the notification
SourceUserId sql.NullString
Cause NotificationCauseType // What the cause of the notification is
ViewedState NotificationViewedState // What the last known state of the notification is
}
type INotification interface {
// Update a given set of notifications to a given viewed state
//
// UPDATE @@table SET viewed_state = @state WHERE id IN @id
SetState(state NotificationViewedState, ids ...uint) error
// Get the lastest count amount of notifications with a given offset for a user
//
// SELECT * FROM @@table WHERE for_user_id = @id
// ORDER BY id DESC
// {{if count > 0 }}
// LIMIT @count
// {{else}}
// LIMIT 20
// {{end}}
// OFFSET @offset
GetLatestWithOffset(userId string, count uint, offset uint) ([]gen.T, error)
}

View file

@ -0,0 +1,22 @@
package models
import "database/sql/driver"
// What a notification is caused by
type NotificationCauseType uint8
const (
NotificationTypeReply NotificationCauseType = iota // A new reply
NotificationTypeReaction // A new reaction
NotificationTypeBoost // A note got boosted
NotificationTypeFollowRequest // Someone requested to follow
)
func (r *NotificationCauseType) Value() (driver.Value, error) {
return r, nil
}
func (ct *NotificationCauseType) Scan(value any) error {
*ct = NotificationCauseType(value.(uint8))
return nil
}

View file

@ -0,0 +1,21 @@
package models
import "database/sql/driver"
type NotificationViewedState uint8
const (
NotViewed NotificationViewedState = iota
Viewed
Accepted
Denied
)
func (r *NotificationViewedState) Value() (driver.Value, error) {
return r, nil
}
func (ct *NotificationViewedState) Scan(value any) error {
*ct = NotificationViewedState(value.(uint8))
return nil
}