diff --git a/providers/db/pages.go b/providers/db/pages.go new file mode 100644 index 0000000..1e5b9fc --- /dev/null +++ b/providers/db/pages.go @@ -0,0 +1,115 @@ +package db + +import ( + "context" + "time" + + "lmika.dev/lmika/weiro/models" + "lmika.dev/lmika/weiro/providers/db/gen/sqlgen" +) + +func (db *Provider) SelectPagesOfSite(ctx context.Context, siteID int64) ([]*models.Page, error) { + rows, err := db.queries.SelectPagesOfSite(ctx, siteID) + if err != nil { + return nil, err + } + pages := make([]*models.Page, len(rows)) + for i, row := range rows { + pages[i] = dbPageToPage(row) + } + return pages, nil +} + +func (db *Provider) SelectPage(ctx context.Context, id int64) (*models.Page, error) { + row, err := db.queries.SelectPage(ctx, id) + if err != nil { + return nil, err + } + return dbPageToPage(row), nil +} + +func (db *Provider) SelectPageByGUID(ctx context.Context, guid string) (*models.Page, error) { + row, err := db.queries.SelectPageByGUID(ctx, guid) + if err != nil { + return nil, err + } + return dbPageToPage(row), nil +} + +func (db *Provider) SelectPageBySlugAndSite(ctx context.Context, siteID int64, slug string) (*models.Page, error) { + row, err := db.queries.SelectPageBySlugAndSite(ctx, sqlgen.SelectPageBySlugAndSiteParams{ + SiteID: siteID, + Slug: slug, + }) + if err != nil { + return nil, err + } + return dbPageToPage(row), nil +} + +func (db *Provider) SavePage(ctx context.Context, page *models.Page) error { + if page.ID == 0 { + showInNav := int64(0) + if page.ShowInNav { + showInNav = 1 + } + newID, err := db.queries.InsertPage(ctx, sqlgen.InsertPageParams{ + SiteID: page.SiteID, + Guid: page.GUID, + Title: page.Title, + Slug: page.Slug, + Body: page.Body, + PageType: int64(page.PageType), + ShowInNav: showInNav, + SortOrder: int64(page.SortOrder), + CreatedAt: timeToInt(page.CreatedAt), + UpdatedAt: timeToInt(page.UpdatedAt), + }) + if err != nil { + return err + } + page.ID = newID + return nil + } + + showInNav := int64(0) + if page.ShowInNav { + showInNav = 1 + } + return db.queries.UpdatePage(ctx, sqlgen.UpdatePageParams{ + Title: page.Title, + Slug: page.Slug, + Body: page.Body, + PageType: int64(page.PageType), + ShowInNav: showInNav, + UpdatedAt: timeToInt(page.UpdatedAt), + ID: page.ID, + }) +} + +func (db *Provider) UpdatePageSortOrder(ctx context.Context, id int64, sortOrder int) error { + return db.queries.UpdatePageSortOrder(ctx, sqlgen.UpdatePageSortOrderParams{ + SortOrder: int64(sortOrder), + ID: id, + }) +} + +func (db *Provider) DeletePage(ctx context.Context, id int64) error { + return db.queries.DeletePage(ctx, id) +} + +func dbPageToPage(row sqlgen.Page) *models.Page { + return &models.Page{ + ID: row.ID, + SiteID: row.SiteID, + GUID: row.Guid, + Title: row.Title, + Slug: row.Slug, + Body: row.Body, + PageType: int(row.PageType), + ShowInNav: row.ShowInNav != 0, + SortOrder: int(row.SortOrder), + CreatedAt: time.Unix(row.CreatedAt, 0).UTC(), + UpdatedAt: time.Unix(row.UpdatedAt, 0).UTC(), + } +}