feat: associate dataset sources with owners

This commit is contained in:
2026-07-23 21:44:47 +08:00
parent 50d8246915
commit 55ff320cec
7 changed files with 112 additions and 14 deletions

View File

@@ -5,9 +5,11 @@ import "time"
type SaDatasetSource struct {
ID uint `gorm:"primaryKey"`
Identity string `gorm:"type:char(36);uniqueIndex"`
CreatedBy uint `gorm:"index;not null;uniqueIndex:idx_sa_dataset_source_seed,priority:1"`
OwnerID uint `gorm:"index;not null;default:0;uniqueIndex:idx_sa_dataset_source_owner_seed,priority:1"`
OwnerIdentity string `gorm:"type:char(36);index"`
CreatedBy uint `gorm:"index;not null"`
CreatedByIdentity string `gorm:"type:char(36);index"`
SeedKey *string `gorm:"size:64;uniqueIndex:idx_sa_dataset_source_seed,priority:2"`
SeedKey *string `gorm:"size:64;uniqueIndex:idx_sa_dataset_source_owner_seed,priority:2"`
Name string `gorm:"size:160;not null"`
Kind string `gorm:"size:32;not null"`
URL string `gorm:"size:2048"`

View File

@@ -22,6 +22,15 @@ func (m *SaDatasetSource) BeforeCreate(tx *gorm.DB) error {
if err := ensureIdentity(&m.Identity); err != nil {
return err
}
if m.OwnerID == 0 {
m.OwnerID = m.CreatedBy
}
if m.CreatedBy == 0 {
m.CreatedBy = m.OwnerID
}
if err := resolveIdentity(tx, &SaUser{}, m.OwnerID, &m.OwnerIdentity); err != nil {
return err
}
return resolveIdentity(tx, &SaUser{}, m.CreatedBy, &m.CreatedByIdentity)
}

View File

@@ -40,6 +40,20 @@ func TestBeforeCreateCopiesParentIdentitiesFromNumericIDs(t *testing.T) {
require.Equal(t, item.Identity, *task.SourceInboxItemIdentity)
}
func TestDatasetSourceBeforeCreateAssociatesOwner(t *testing.T) {
database := newIdentityTestDB(t)
user := SaUser{Email: "owner@example.com", DisplayName: "Owner", PasswordHash: "hash"}
require.NoError(t, database.Create(&user).Error)
source := SaDatasetSource{OwnerID: user.ID, Name: "Owned feed", Kind: "rss"}
require.NoError(t, database.Create(&source).Error)
require.Equal(t, user.ID, source.OwnerID)
require.Equal(t, user.Identity, source.OwnerIdentity)
require.Equal(t, user.ID, source.CreatedBy)
require.Equal(t, user.Identity, source.CreatedByIdentity)
}
func newIdentityTestDB(t *testing.T) *gorm.DB {
t.Helper()
database, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name())), &gorm.Config{})