diff --git a/domain/domain.go b/domain/domain.go index b0a6f8e..c93c64d 100755 --- a/domain/domain.go +++ b/domain/domain.go @@ -22,7 +22,7 @@ func NewDomain() Domain { releaseRepository := &ReleaseRepository{db: DB} fileRepository := NewFileRepository() - softwareService := NewSoftwareService(softwareRepository) + softwareService := NewSoftwareService(softwareRepository, releaseRepository) tic80Updater := NewSoftwareUpdaterTIC80Service( softwareRepository, diff --git a/domain/repository.file.go b/domain/repository.file.go index f1db2a2..352566d 100644 --- a/domain/repository.file.go +++ b/domain/repository.file.go @@ -72,6 +72,7 @@ func (fr *FileRepository) UnzipFile(path, destPath string) error { for _, f := range r.File { path := filepath.Join(fullDestPath, f.Name) + fmt.Printf("ZIP: Extracting %s\n", path) if f.FileInfo().IsDir() { os.MkdirAll(path, 0755) diff --git a/domain/repository.release.go b/domain/repository.release.go index a958d1c..14f983f 100644 --- a/domain/repository.release.go +++ b/domain/repository.release.go @@ -7,6 +7,7 @@ type ReleaseRepositoryInterface interface { CreateIfNotExist(release *Release) error FindLatestBySoftwareID(softwareID uint) (*Release, error) FindBySoftwareIDAndVersion(softwareID uint, version string) (*Release, error) + ListBySoftwareID(softwareID uint) []Release } type ReleaseRepository struct { @@ -40,3 +41,9 @@ func (r *ReleaseRepository) FindBySoftwareIDAndVersion(softwareID uint, version err := r.db.Where("software_id = ? AND version = ?", softwareID, version).First(&release).Error return &release, err } + +func (r *ReleaseRepository) ListBySoftwareID(softwareID uint) []Release { + var releases []Release + r.db.Where("software_id = ?", softwareID).Find(&releases) + return releases +} diff --git a/domain/service.software.go b/domain/service.software.go index 4f80512..c9a818b 100644 --- a/domain/service.software.go +++ b/domain/service.software.go @@ -1,24 +1,42 @@ package domain -import "sort" +import ( + "fmt" + "sort" +) type SoftwareListDTO struct { Software LatestRelease *Release } +type SoftwareShowData struct { + Software *Software + Releases []Release + LatestRelease *Release + WebPlayableRelease *Release +} + type SoftwareServiceInterface interface { List() ([]SoftwareListDTO, error) GetByName(name string) (*Software, error) GetLatestRelease(softwareID string) (*Release, error) + GetForShowByName(name string) (*SoftwareShowData, error) } type SoftwareService struct { softeare_repository SoftwareRepositoryInterface + release_repository ReleaseRepositoryInterface } -func NewSoftwareService(softeare_repository SoftwareRepositoryInterface) *SoftwareService { - return &SoftwareService{softeare_repository: softeare_repository} +func NewSoftwareService( + softeare_repository SoftwareRepositoryInterface, + release_repository ReleaseRepositoryInterface, +) *SoftwareService { + return &SoftwareService{ + softeare_repository: softeare_repository, + release_repository: release_repository, + } } func (s *SoftwareService) List() ([]SoftwareListDTO, error) { @@ -44,6 +62,42 @@ func (s *SoftwareService) List() ([]SoftwareListDTO, error) { func (s *SoftwareService) GetByName(name string) (*Software, error) { return s.softeare_repository.GetByName(name) + +} + +func (s *SoftwareService) GetForShowByName(name string) (*SoftwareShowData, error) { + software, err := s.softeare_repository.GetByName(name) + if err != nil { + return nil, err + } + if software == nil { + return nil, fmt.Errorf("software not found") + } + + releases := s.release_repository.ListBySoftwareID(software.ID) + + var latest_release *Release + if len(releases) > 0 { + sort.Slice(releases, func(i, j int) bool { + return releases[i].CreatedAt.After(releases[j].CreatedAt) + }) + latest_release = &releases[0] + } + + var web_payable_release *Release + for _, release := range releases { + if release.HTMLFolderPath != "" { + web_payable_release = &release + break + } + } + + return &SoftwareShowData{ + Software: software, + Releases: releases, + LatestRelease: latest_release, + WebPlayableRelease: web_payable_release, + }, nil } func (s *SoftwareService) GetLatestRelease(softwareID string) (*Release, error) { diff --git a/http/controller.root.go b/http/controller.root.go index 6b79a8c..ce51a59 100644 --- a/http/controller.root.go +++ b/http/controller.root.go @@ -15,7 +15,7 @@ func NewRootController() *RootController { return &RootController{} } -func (c *RootController) index(w http.ResponseWriter, r *http.Request) { +func (c *RootController) Index(w http.ResponseWriter, r *http.Request) { tmpl, err := template_utils.GetTemplate("root_index", "http/views/shared/layout.html", "http/views/root/index.html") if err != nil { diff --git a/http/controller.software.go b/http/controller.software.go index b064444..379ec13 100644 --- a/http/controller.software.go +++ b/http/controller.software.go @@ -17,7 +17,7 @@ func NewSoftwareController(software_service domain.SoftwareServiceInterface) *So return &SoftwareController{softwareService: software_service} } -func (c *SoftwareController) index(w http.ResponseWriter, r *http.Request) { +func (c *SoftwareController) Index(w http.ResponseWriter, r *http.Request) { softwares, err := c.softwareService.List() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) @@ -33,41 +33,20 @@ func (c *SoftwareController) index(w http.ResponseWriter, r *http.Request) { tmpl.Execute(w, softwares) } -type SoftwareShowData struct { - Software *domain.Software - LatestRelease *domain.Release -} - -func (c *SoftwareController) show(w http.ResponseWriter, r *http.Request) { +func (c *SoftwareController) Show(w http.ResponseWriter, r *http.Request) { name := chi.URLParam(r, "name") - software, err := c.softwareService.GetByName(name) + data, err := c.softwareService.GetForShowByName(name) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if software == nil { - http.NotFound(w, r) - return - } - - latest_release, err := c.softwareService.GetLatestRelease(software.Name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - if latest_release == nil { - http.NotFound(w, r) - return - } tmpl, err := template_utils.GetTemplate("software_show", "http/views/shared/layout.html", "http/views/software/show.html") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - tmpl.Execute(w, SoftwareShowData{ - Software: software, - LatestRelease: latest_release, - }) + tmpl.Execute(w, data) + } diff --git a/http/controller.software_updater.go b/http/controller.software_updater.go index e8a016a..66763d5 100644 --- a/http/controller.software_updater.go +++ b/http/controller.software_updater.go @@ -15,7 +15,7 @@ func NewSoftwareUpdaterController(service domain.SoftwareUpdaterServiceInterface return &SoftwareUpdaterController{service: service} } -func (c *SoftwareUpdaterController) update(w http.ResponseWriter, r *http.Request) { +func (c *SoftwareUpdaterController) Update(w http.ResponseWriter, r *http.Request) { secret := r.URL.Query().Get("secret") if secret != os.Getenv("UPDATE_SECRET") { http.Error(w, "Unauthorized", http.StatusUnauthorized) diff --git a/http/router.go b/http/router.go index abf9e34..0ebbf1b 100755 --- a/http/router.go +++ b/http/router.go @@ -33,11 +33,11 @@ func NewRouter( func (r *Router) Init() *chi.Mux { router := chi.NewRouter() - router.Get("/", r.rootController.index) - router.Get("/software", r.softwareController.index) - router.Get("/software/{name}", r.softwareController.show) + router.Get("/", r.rootController.Index) + router.Get("/software", r.softwareController.Index) + router.Get("/software/{name}", r.softwareController.Show) - router.Get("/update", r.softwareUpdaterController.update) + router.Get("/update", r.softwareUpdaterController.Update) router.Get("/download/{name}/source", r.downloadController.GetLatestSource) router.Get("/download/{name}/cartridge", r.downloadController.GetLatestCartridge) router.Get("/download/{name}/{version}/source", r.downloadController.GetSource) diff --git a/http/views/software/index.html b/http/views/software/index.html index 4af448a..be27ec9 100644 --- a/http/views/software/index.html +++ b/http/views/software/index.html @@ -2,27 +2,14 @@

Softwares

- {{range .}}
-
-
-
{{.Title}}
-
{{.Author}}
-

{{.Desc}}

-

Version: {{.LatestRelease.Version}}

-

License: {{.License}}

-

Website

-
- -
+
- {{end}}
-{{end}} +{{end}} \ No newline at end of file diff --git a/http/views/software/show.html b/http/views/software/show.html index edae676..4bf793e 100644 --- a/http/views/software/show.html +++ b/http/views/software/show.html @@ -1,8 +1,39 @@ {{define "content"}} -

Releases for {{.Software.Title}}

-
- {{range .Software.Releases}} +
+
+
+
{{.Software.Title}}
+
{{.Software.Author}}
+

{{.Software.Desc}}

+

Version: {{.LatestRelease.Version}}

+

License: {{.Software.License}}

+

Website

+
+ +
+
+
+EEEE +{{if .WebPlayableRelease}} +

Play

+
+
+ +
+
+{{end}} +

Releases

+
+ {{range .Releases}}
@@ -12,10 +43,12 @@
@@ -24,4 +57,4 @@

Back to Softwares

-{{end}} +{{end}} \ No newline at end of file