From 2bf56e3c1b7b3b3d5cfc0dc33db370956ec83d12 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Sat, 28 Feb 2026 12:59:15 +0100 Subject: [PATCH] love update --- domain/domain.go | 9 +- domain/service.software_updater.go | 7 +- domain/service.software_updater_love.go | 125 ++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 domain/service.software_updater_love.go diff --git a/domain/domain.go b/domain/domain.go index 6b1a309..99f812c 100755 --- a/domain/domain.go +++ b/domain/domain.go @@ -35,7 +35,14 @@ func NewDomain() Domain { release_repository, file_repository, ) - software_updater_service := NewSoftwareUpdaterService(tic80_updater, ebitengine_updater) + + love_updater := NewSoftwareUpdaterLoveService( + software_repository, + release_repository, + file_repository, + ) + + software_updater_service := NewSoftwareUpdaterService(tic80_updater, ebitengine_updater, love_updater) download_service := NewDownloadService(software_repository, release_repository) diff --git a/domain/service.software_updater.go b/domain/service.software_updater.go index e0571a6..2d15c10 100644 --- a/domain/service.software_updater.go +++ b/domain/service.software_updater.go @@ -11,12 +11,14 @@ type SoftwareUpdaterServiceInterface interface { type SoftwareUpdaterService struct { tic80Updater SoftwareUpdaterTIC80ServiceInterface ebitengineUpdater SoftwareUpdaterEbitengineServiceInterface + loveUpdater SoftwareUpdaterLoveServiceInterface } -func NewSoftwareUpdaterService(tic80_updater SoftwareUpdaterTIC80ServiceInterface, ebitengine_updater SoftwareUpdaterEbitengineServiceInterface) *SoftwareUpdaterService { +func NewSoftwareUpdaterService(tic80_updater SoftwareUpdaterTIC80ServiceInterface, ebitengine_updater SoftwareUpdaterEbitengineServiceInterface, love_updater SoftwareUpdaterLoveServiceInterface) *SoftwareUpdaterService { return &SoftwareUpdaterService{ tic80Updater: tic80_updater, ebitengineUpdater: ebitengine_updater, + loveUpdater: love_updater, } } @@ -27,5 +29,8 @@ func (s *SoftwareUpdaterService) Update(platform, name, version string) error { if platform == "ebitengine" { return s.ebitengineUpdater.Update(name, version) } + if platform == "love" { + return s.loveUpdater.Update(name, version) + } return fmt.Errorf("unsupported platform: %s", platform) } diff --git a/domain/service.software_updater_love.go b/domain/service.software_updater_love.go new file mode 100644 index 0000000..0ef0f4c --- /dev/null +++ b/domain/service.software_updater_love.go @@ -0,0 +1,125 @@ +package domain + +import ( + "encoding/json" + "fmt" + "os" +) + +type SoftwareUpdaterLoveMetadata struct { + Name string `json:"name"` + Title string `json:"title"` + Author string `json:"author"` + Desc string `json:"desc"` + Site string `json:"site"` + License string `json:"license"` +} + +type SoftwareUpdaterLoveServiceInterface interface { + Update(name, version string) error +} + +type SoftwareUpdaterLoveService struct { + softwareRepository SoftwareRepositoryInterface + releaseRepository ReleaseRepositoryInterface + fileRepository FileRepositoryInterface +} + +func NewSoftwareUpdaterLoveService( + software_repository SoftwareRepositoryInterface, + release_repository ReleaseRepositoryInterface, + file_repository FileRepositoryInterface, +) *SoftwareUpdaterLoveService { + return &SoftwareUpdaterLoveService{ + softwareRepository: software_repository, + releaseRepository: release_repository, + fileRepository: file_repository, + } +} + +func (s *SoftwareUpdaterLoveService) Update(name, version string) error { + fmt.Printf("Love Updater: Starting update for name: %s, version: %s\n", name, version) + + versioned_name := name + "-" + version + + zip_filename := versioned_name + ".html.zip" + metadata_filename := versioned_name + ".metadata.json" + html_dirname := versioned_name + + fmt.Printf("Love Updater: Processing zip file: %s\n", zip_filename) + fmt.Printf("Love Updater: Processing metadata file: %s\n", metadata_filename) + fmt.Printf("Love Updater: Processing HTML directory: %s\n", html_dirname) + + if s.fileRepository.FileExists(html_dirname) { + fmt.Printf("Love Updater: Removing existing HTML directory: %s\n", html_dirname) + s.fileRepository.DeleteDir(html_dirname) + } + + fmt.Printf("Love Updater: Creating HTML directory: %s\n", html_dirname) + s.fileRepository.CreateDir(html_dirname) + fmt.Printf("Love Updater: Unzipping file: %s to directory: %s\n", zip_filename, html_dirname) + s.fileRepository.UnzipFile(zip_filename, html_dirname) + + html_dir_path := s.fileRepository.GetPath(html_dirname) + metadata_path := s.fileRepository.GetPath(metadata_filename) + + var err error + + fmt.Printf("Love Updater: Extracting metadata from metadata file: %s\n", metadata_path) + meta_data, err := s.GetMetadata(metadata_path) + if err != nil { + fmt.Printf("Love Updater: Error extracting metadata: %s\n", err.Error()) + return err + } + fmt.Printf("Love Updater: Extracted metadata: %+v\n", meta_data) + software := s.BuildSoftware(meta_data) + + err = s.softwareRepository.UpdateOrCreate(software) + if err != nil { + fmt.Printf("Love Updater: Error updating or creating software: %s\n", err.Error()) + return err + } + + release := Release{ + SoftwareID: software.ID, + Version: version, + CartridgePath: "", + SourcePath: "", + HTMLFolderPath: html_dir_path, + } + + fmt.Printf("Love Updater: Creating release for software ID: %d, version: %s\n", software.ID, version) + s.releaseRepository.CreateIfNotExist(&release) + + fmt.Printf("Love Updater: Successfully processed Lua cartridge: %s\n", name) + return nil +} + +func (s *SoftwareUpdaterLoveService) BuildSoftware(metadata SoftwareUpdaterLoveMetadata) *Software { + software := &Software{ + Name: metadata.Name, + Title: metadata.Title, + Author: metadata.Author, + Desc: metadata.Desc, + Site: metadata.Site, + License: metadata.License, + Platform: "love", + } + + return software +} + +func (s *SoftwareUpdaterLoveService) GetMetadata(metadata_path string) (SoftwareUpdaterLoveMetadata, error) { + var metadata SoftwareUpdaterLoveMetadata + + data, err := os.ReadFile(metadata_path) + if err != nil { + return metadata, err + } + + if err := json.Unmarshal(data, &metadata); err != nil { + return metadata, err + } + + return metadata, nil +}