feat: github projects route

This commit is contained in:
trafficlunar 2025-05-03 16:09:46 +01:00
parent a1f22391e9
commit a3eb6c6e32
7 changed files with 115 additions and 0 deletions

View file

@ -8,6 +8,10 @@ LASTFM_USERNAME="axolotlmaid"
# API key for last.fm # API key for last.fm
LASTFM_API_KEY="API_KEY_GOES_HERE" LASTFM_API_KEY="API_KEY_GOES_HERE"
# GitHub slugs split by comma (,)
GITHUB_PROJECTS="trafficlunar/options-profiles,trafficlunar/blockmatic"
# GitHub token
GITHUB_TOKEN="API_KEY_GOES_HERE"
# The password for the computer WebSocket # The password for the computer WebSocket
WEBSOCKET_PASSWORD="PASSWORD_GOES_HERE" WEBSOCKET_PASSWORD="PASSWORD_GOES_HERE"

View file

@ -0,0 +1,12 @@
package handler
import (
"api/internal/worker"
"encoding/json"
"net/http"
)
func HandleGetProjects(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(worker.GitHubData)
}

16
internal/model/github.go Normal file
View file

@ -0,0 +1,16 @@
package model
type GitHubAPI struct {
Description string `json:"description"`
Stars uint32 `json:"stargazers_count"`
Language string `json:"language"`
Url string `json:"html_url"`
}
type GitHubData struct {
Name string `json:"name"`
Description string `json:"description"`
Stars string `json:"stars"`
Language string `json:"language"`
Url string `json:"url"`
}

View file

@ -54,6 +54,7 @@ func NewRouter() {
r.Get("/hit", handler.HandleGetHitCounter) r.Get("/hit", handler.HandleGetHitCounter)
r.With(httprate.LimitByRealIP(1, time.Hour)).Patch("/hit", handler.HandlePatchHitCounter) r.With(httprate.LimitByRealIP(1, time.Hour)).Patch("/hit", handler.HandlePatchHitCounter)
r.Get("/song", handler.HandleGetCurrentlyPlaying) r.Get("/song", handler.HandleGetCurrentlyPlaying)
r.Get("/projects", handler.HandleGetProjects)
r.Get("/computer", handler.HandleComputerGraphData) r.Get("/computer", handler.HandleComputerGraphData)
r.Get("/computer/ws", handler.HandleComputerWebSocket) r.Get("/computer/ws", handler.HandleComputerWebSocket)

View file

@ -0,0 +1,62 @@
package service
import (
"api/internal/model"
"encoding/json"
"fmt"
"io"
"log/slog"
"net/http"
"os"
"strings"
)
func GetGitHubData() []model.GitHubData {
data := []model.GitHubData{}
projects := strings.Split(os.Getenv("GITHUB_PROJECTS"), ",")
client := &http.Client{}
// Go through every project specified in GITHUB_PROJECTS
for _, project := range projects {
url := fmt.Sprintf("https://api.github.com/repos/%s", project)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
slog.Error("Error creating request", slog.Any("error", err))
continue
}
// Add authorization header
req.Header.Set("Authorization", "token "+os.Getenv("GITHUB_TOKEN"))
res, err := client.Do(req)
if err != nil {
slog.Error("Error requesting GitHub API", slog.Any("error", err))
continue
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
slog.Error("Error reading body", slog.Any("error", err))
continue
}
var apiResponse model.GitHubAPI
err = json.Unmarshal(body, &apiResponse)
if err != nil {
slog.Error("Error unmarshalling JSON", slog.Any("error", err))
continue
}
data = append(data, model.GitHubData{
Name: project,
Description: apiResponse.Description,
Stars: fmt.Sprint(apiResponse.Stars),
Language: apiResponse.Language,
Url: apiResponse.Url,
})
}
return data
}

19
internal/worker/github.go Normal file
View file

@ -0,0 +1,19 @@
package worker
import (
"api/internal/model"
"api/internal/service"
"log/slog"
"time"
)
var GitHubData []model.GitHubData
func StartGitHubWorker() {
slog.Info("Starting GitHub worker...")
GitHubData = service.GetGitHubData()
for range time.Tick(24 * time.Hour) {
GitHubData = service.GetGitHubData()
}
}

View file

@ -3,5 +3,6 @@ package worker
func StartWorkers() { func StartWorkers() {
go StartDataStoreWorker() go StartDataStoreWorker()
go StartLastFMWorker() go StartLastFMWorker()
go StartGitHubWorker()
go StartComputerWorker() go StartComputerWorker()
} }