diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-14 11:52:56 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-14 11:53:08 +0900 |
| commit | 2889b562e64993482bd13fd806af8ed0865bab8b (patch) | |
| tree | 39400ac4d994fb33d2c544e7d4b9d98f8ecbd86a /backend/api/converters.go | |
| parent | e216c3bc97994b4172d15d52b46d5f6b75f35ea4 (diff) | |
| download | feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.tar.gz feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.tar.zst feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.zip | |
refactor: migrate API from GraphQL to REST (TypeSpec/OpenAPI)
Replace the entire GraphQL stack (gqlgen, urql, graphql-codegen) with a
TypeSpec → OpenAPI 3.x pipeline using oapi-codegen for Go server stubs
and openapi-fetch + openapi-typescript for the frontend client.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'backend/api/converters.go')
| -rw-r--r-- | backend/api/converters.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/backend/api/converters.go b/backend/api/converters.go new file mode 100644 index 0000000..0ccbdc0 --- /dev/null +++ b/backend/api/converters.go @@ -0,0 +1,79 @@ +package api + +import ( + "strconv" + + "undef.ninja/x/feedaka/db" +) + +func dbFeedToAPI(f db.Feed, unreadCount int64) Feed { + return Feed{ + Id: strconv.FormatInt(f.ID, 10), + Url: f.Url, + Title: f.Title, + FetchedAt: f.FetchedAt, + IsSubscribed: f.IsSubscribed == 1, + UnreadCount: int32(unreadCount), + } +} + +type articleRow struct { + ID int64 + FeedID int64 + Guid string + Title string + Url string + IsRead int64 + FeedID2 int64 + FeedUrl string + FeedTitle string + FeedIsSubscribed int64 +} + +func toArticleRow(r any) articleRow { + switch v := r.(type) { + case db.GetArticlesPaginatedRow: + return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed} + case db.GetArticlesPaginatedAfterRow: + return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed} + case db.GetArticlesByFeedPaginatedRow: + return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed} + case db.GetArticlesByFeedPaginatedAfterRow: + return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed} + default: + panic("unexpected row type") + } +} + +func rowToArticle(row articleRow) Article { + return Article{ + Id: strconv.FormatInt(row.ID, 10), + FeedId: strconv.FormatInt(row.FeedID, 10), + Guid: row.Guid, + Title: row.Title, + Url: row.Url, + IsRead: row.IsRead == 1, + Feed: ArticleFeed{ + Id: strconv.FormatInt(row.FeedID2, 10), + Url: row.FeedUrl, + Title: row.FeedTitle, + IsSubscribed: row.FeedIsSubscribed == 1, + }, + } +} + +func dbArticleToAPI(row db.GetArticleRow) Article { + return Article{ + Id: strconv.FormatInt(row.ID, 10), + FeedId: strconv.FormatInt(row.FeedID, 10), + Guid: row.Guid, + Title: row.Title, + Url: row.Url, + IsRead: row.IsRead == 1, + Feed: ArticleFeed{ + Id: strconv.FormatInt(row.FeedID2, 10), + Url: row.FeedUrl, + Title: row.FeedTitle, + }, + } +} |
