refactor: splits out pTerm UI logic from internal code

This commit is contained in:
Dennis Schoepf 2025-08-29 14:23:28 +02:00
parent 86c0f92cc6
commit 0598672fbe
2 changed files with 54 additions and 17 deletions

View file

@ -17,7 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package cmd package cmd
import ( import (
"fmt"
"freed/internal" "freed/internal"
"strconv"
"github.com/pterm/pterm" "github.com/pterm/pterm"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -32,7 +34,14 @@ var listCmd = &cobra.Command{
Example: `freed list Example: `freed list
freed ls`, freed ls`,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
tableData, err := internal.GetAllFeedsAsTable() feeds, err := internal.GetAllFeeds()
if err != nil {
pterm.Error.Printf("Error getting feeds: %v\n", err)
return
}
tableData, err := mapFeedsToPtermTable(*feeds)
if err != nil { if err != nil {
pterm.Error.Printf("Error listing feeds: %v\n", err) pterm.Error.Printf("Error listing feeds: %v\n", err)
@ -56,3 +65,25 @@ func init() {
// is called directly, e.g.: // is called directly, e.g.:
// listCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") // listCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
} }
func mapFeedsToPtermTable(feeds []internal.Feed) (pterm.TableData, error) {
tableData := pterm.TableData{}
headerRow := []string{"ID", "Name", "Url", "Item Count", "Created At", "Last Synced At"}
tableData = append(tableData, headerRow)
for _, feed := range feeds {
rowData := []string{
fmt.Sprintf("[%d]", feed.ID),
feed.Name,
feed.Url,
strconv.Itoa(feed.ArticleCount),
pterm.Gray(feed.CreatedAt),
pterm.Gray(feed.LastSyncedAt),
}
tableData = append(tableData, rowData)
}
return tableData, nil
}

View file

@ -12,6 +12,15 @@ import (
"github.com/pterm/pterm" "github.com/pterm/pterm"
) )
type Feed struct {
ID int64
Name string
Url string
CreatedAt *time.Time
LastSyncedAt *time.Time
ArticleCount int
}
func AddFeed(feedUrl string) (string, int, error) { func AddFeed(feedUrl string) (string, int, error) {
if _, err := url.ParseRequestURI(feedUrl); err != nil { if _, err := url.ParseRequestURI(feedUrl); err != nil {
return "", 0, fmt.Errorf("The given URL does not seem to be valid: %s", err) return "", 0, fmt.Errorf("The given URL does not seem to be valid: %s", err)
@ -57,32 +66,29 @@ func AddFeed(feedUrl string) (string, int, error) {
return feed.Title, len(articles), nil return feed.Title, len(articles), nil
} }
func GetAllFeedsAsTable() (pterm.TableData, error) { func GetAllFeeds() (*[]Feed, error) {
feeds, err := database.FindAllFeedsWithArticleCount() feedEntities, err := database.FindAllFeedsWithArticleCount()
if err != nil { if err != nil {
return nil, err return nil, err
} }
tableData := pterm.TableData{} var feeds []Feed
headerRow := []string{"ID", "Name", "Url", "Item Count", "Created At", "Last Synced At"}
tableData = append(tableData, headerRow) for _, feedEntity := range *feedEntities {
feed := &Feed{
for _, feed := range *feeds { ID: feedEntity.ID,
rowData := []string{ Name: feedEntity.Name,
fmt.Sprintf("[%d]", feed.ID), Url: feedEntity.Url,
feed.Name, CreatedAt: feedEntity.CreatedAt,
feed.Url, LastSyncedAt: feedEntity.LastSyncedAt,
strconv.Itoa(feed.ArticleCount), ArticleCount: feedEntity.ArticleCount,
pterm.Gray(feed.CreatedAt),
pterm.Gray(feed.LastSyncedAt),
} }
tableData = append(tableData, rowData) feeds = append(feeds, *feed)
} }
return tableData, nil return &feeds, nil
} }
func SyncFeeds() error { func SyncFeeds() error {