Files
software-station/internal/config/config.go
Sudo-Ivan 2f0af4c988 Refactor API and background updater functionality
- Updated the StartBackgroundUpdater function to accept a callback for software list updates, improving flexibility.
- Refactored the API handlers to utilize a proxied software list, enhancing data handling and response efficiency.
- Introduced a new method for refreshing the proxied software list, ensuring accurate data representation.
- Added unit tests for API handlers to validate functionality and response correctness.
2025-12-27 03:30:18 -06:00

86 lines
2.1 KiB
Go

package config
import (
"bufio"
"io"
"log"
"net/http"
"os"
"strings"
"software-station/internal/cache"
"software-station/internal/gitea"
"software-station/internal/models"
)
func LoadSoftware(path, server, token string) []models.Software {
return LoadSoftwareExtended(path, server, token, true)
}
func LoadSoftwareExtended(path, server, token string, useCache bool) []models.Software {
var reader io.Reader
if strings.HasPrefix(path, "http://") || strings.HasPrefix(path, "https://") {
resp, err := http.Get(path) // #nosec G107
if err != nil {
log.Printf("Error fetching remote config: %v", err)
return nil
}
defer resp.Body.Close()
reader = resp.Body
} else {
file, err := os.Open(path) // #nosec G304
if err != nil {
log.Printf("Warning: config file %s not found", path)
return nil
}
defer file.Close()
reader = file
}
var softwareList []models.Software
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
parts := strings.Split(line, "/")
if len(parts) == 2 {
owner, repo := parts[0], parts[1]
if useCache {
if cached, err := cache.GetFromCache(owner, repo); err == nil {
softwareList = append(softwareList, *cached)
continue
}
}
desc, topics, license, isPrivate, avatarURL, err := gitea.FetchRepoInfo(server, token, owner, repo)
if err != nil {
log.Printf("Error fetching repo info for %s/%s: %v", owner, repo, err)
}
releases, err := gitea.FetchReleases(server, token, owner, repo)
if err != nil {
log.Printf("Error fetching releases for %s/%s: %v", owner, repo, err)
}
sw := models.Software{
Name: repo,
Owner: owner,
Description: desc,
Releases: releases,
GiteaURL: server,
Topics: topics,
License: license,
IsPrivate: isPrivate,
AvatarURL: avatarURL,
}
softwareList = append(softwareList, sw)
if err := cache.SaveToCache(owner, repo, sw); err != nil {
log.Printf("Error saving to cache for %s/%s: %v", owner, repo, err)
}
}
}
return softwareList
}