- 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.
86 lines
2.1 KiB
Go
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
|
|
}
|