diff --git a/domain/domain.go b/domain/domain.go index dc52a47..6b1a309 100755 --- a/domain/domain.go +++ b/domain/domain.go @@ -30,7 +30,12 @@ func NewDomain() Domain { file_repository, ) - software_updater_service := NewSoftwareUpdaterService(tic80_updater) + ebitengine_updater := NewSoftwareUpdaterEbitengineService( + software_repository, + release_repository, + file_repository, + ) + software_updater_service := NewSoftwareUpdaterService(tic80_updater, ebitengine_updater) download_service := NewDownloadService(software_repository, release_repository) diff --git a/domain/service.software_updater.go b/domain/service.software_updater.go index 23387b4..e0571a6 100644 --- a/domain/service.software_updater.go +++ b/domain/service.software_updater.go @@ -9,16 +9,23 @@ type SoftwareUpdaterServiceInterface interface { } type SoftwareUpdaterService struct { - tic80Updater SoftwareUpdaterTIC80ServiceInterface + tic80Updater SoftwareUpdaterTIC80ServiceInterface + ebitengineUpdater SoftwareUpdaterEbitengineServiceInterface } -func NewSoftwareUpdaterService(tic80_updater SoftwareUpdaterTIC80ServiceInterface) *SoftwareUpdaterService { - return &SoftwareUpdaterService{tic80Updater: tic80_updater} +func NewSoftwareUpdaterService(tic80_updater SoftwareUpdaterTIC80ServiceInterface, ebitengine_updater SoftwareUpdaterEbitengineServiceInterface) *SoftwareUpdaterService { + return &SoftwareUpdaterService{ + tic80Updater: tic80_updater, + ebitengineUpdater: ebitengine_updater, + } } func (s *SoftwareUpdaterService) Update(platform, name, version string) error { if platform == "tic80" { return s.tic80Updater.Update(name, version) } + if platform == "ebitengine" { + return s.ebitengineUpdater.Update(name, version) + } return fmt.Errorf("unsupported platform: %s", platform) } diff --git a/domain/service.software_updater_ebitengine.go b/domain/service.software_updater_ebitengine.go new file mode 100644 index 0000000..719b2c5 --- /dev/null +++ b/domain/service.software_updater_ebitengine.go @@ -0,0 +1,113 @@ +package domain + +import ( + "encoding/json" + "fmt" + "os" +) + +type SoftwareUpdaterEbitengineMetadata 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 SoftwareUpdaterEbitengineServiceInterface interface { + Update(name, version string) error +} + +type SoftwareUpdaterEbitengineService struct { + softwareRepository SoftwareRepositoryInterface + releaseRepository ReleaseRepositoryInterface + fileRepository FileRepositoryInterface +} + +func NewSoftwareUpdaterEbitengineService( + software_repository SoftwareRepositoryInterface, + release_repository ReleaseRepositoryInterface, + file_repository FileRepositoryInterface, +) *SoftwareUpdaterEbitengineService { + return &SoftwareUpdaterEbitengineService{ + softwareRepository: software_repository, + releaseRepository: release_repository, + fileRepository: file_repository, + } +} + +func (s *SoftwareUpdaterEbitengineService) Update(name, version string) error { + fmt.Printf("Ebitengine 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 + ".meta.json" + html_dirname := versioned_name + + if s.fileRepository.FileExists(html_dirname) { + s.fileRepository.DeleteDir(html_dirname) + } + + s.fileRepository.CreateDir(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 + + meta_data, err := s.GetMetadata(metadata_path) + if err != nil { + return err + } + software := s.BuildSoftware(meta_data) + + err = s.softwareRepository.UpdateOrCreate(software) + if err != nil { + return err + } + + release := Release{ + SoftwareID: software.ID, + Version: version, + CartridgePath: "", + SourcePath: "", + HTMLFolderPath: html_dir_path, + } + + s.releaseRepository.CreateIfNotExist(&release) + + fmt.Printf("Ebitengine Updater: Successfully processed Lua cartridge: %s\n", name) + return nil +} + +func (s *SoftwareUpdaterEbitengineService) BuildSoftware(metadata SoftwareUpdaterEbitengineMetadata) *Software { + software := &Software{ + Name: metadata.Name, + Title: metadata.Title, + Author: metadata.Author, + Desc: metadata.Desc, + Site: metadata.Site, + License: metadata.License, + Platform: "ebitengine", + } + + return software +} + +func (s *SoftwareUpdaterEbitengineService) GetMetadata(metadata_path string) (SoftwareUpdaterEbitengineMetadata, error) { + var metadata SoftwareUpdaterEbitengineMetadata + + 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 +}