diff --git a/apps/catalog/assets/css/style.css b/apps/catalog/assets/css/style.css deleted file mode 100644 index e69de29..0000000 diff --git a/apps/catalog/assets/js/.keep b/apps/catalog/assets/js/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/catalog/http/controller.docs.go b/apps/catalog/http/controller.docs.go deleted file mode 100644 index 5ccabc2..0000000 --- a/apps/catalog/http/controller.docs.go +++ /dev/null @@ -1,70 +0,0 @@ -package http - -import ( - "fmt" - "net/http" - "os" - "teletype_softwares/domain" - - "github.com/go-chi/chi/v5" -) - -type DocsController struct { - softwareService domain.SoftwareServiceInterface - fileService domain.FileServiceInterface -} - -func NewDocsController(software_service domain.SoftwareServiceInterface, file_service domain.FileServiceInterface) *DocsController { - return &DocsController{ - softwareService: software_service, - fileService: file_service, - } -} - -func (c *DocsController) ServeDocs(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - version := chi.URLParam(r, "version") - - software, err := c.softwareService.GetByName(name) - if err != nil { - if err == domain.ErrSoftwareNotFound { - http.Error(w, "Software not found", http.StatusNotFound) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - var targetRelease *domain.Release - for _, release := range software.Releases { - if release.Version == version && release.DocsFolderPath != "" { - targetRelease = &release - break - } - } - - if targetRelease == nil { - http.Error(w, "No documentation found for this release", http.StatusNotFound) - return - } - - docs_base_dir := targetRelease.DocsFolderPath - - if _, err := os.Stat(docs_base_dir); os.IsNotExist(err) { - http.Error(w, fmt.Sprintf("Documentation for '%s' version '%s' not found.", name, version), http.StatusNotFound) - return - } else if err != nil { - http.Error(w, fmt.Sprintf("Error accessing documentation for '%s' version '%s': %v", name, version, err), http.StatusInternalServerError) - return - } - - prefix := fmt.Sprintf("/docs/%s/%s", name, version) - - if r.URL.Path == prefix { - http.Redirect(w, r, prefix+"/", http.StatusMovedPermanently) - return - } - - fs := http.StripPrefix(prefix, http.FileServer(http.Dir(docs_base_dir))) - fs.ServeHTTP(w, r) -} diff --git a/apps/catalog/http/controller.download.go b/apps/catalog/http/controller.download.go deleted file mode 100644 index 7499380..0000000 --- a/apps/catalog/http/controller.download.go +++ /dev/null @@ -1,114 +0,0 @@ -package http - -import ( - "net/http" - "os" - "path/filepath" - "strings" - - "teletype_softwares/domain" - - "github.com/go-chi/chi/v5" -) - -type DownloadController struct { - downloadService domain.DownloadServiceInterface - softwareService domain.SoftwareServiceInterface -} - -func NewDownloadController( - downloadService domain.DownloadServiceInterface, - softwareService domain.SoftwareServiceInterface, -) *DownloadController { - return &DownloadController{ - downloadService: downloadService, - softwareService: softwareService, - } -} - -func (c *DownloadController) serve(w http.ResponseWriter, r *http.Request, release *domain.Release, is_source bool) { - var file_path string - if is_source { - file_path = release.SourcePath - } else { - file_path = release.CartridgePath - } - - abs_file_path, err := filepath.Abs(file_path) - if err != nil { - http.Error(w, "Invalid file path", http.StatusInternalServerError) - return - } - - abs_contents_dir, err := filepath.Abs(os.Getenv("FILE_CONTAINER_PATH")) - if err != nil { - http.Error(w, "Invalid contents directory path", http.StatusInternalServerError) - return - } - - if !strings.HasPrefix(abs_file_path, abs_contents_dir) { - http.Error(w, "Access denied", http.StatusForbidden) - return - } - - w.Header().Set("Content-Disposition", "attachment; filename="+filepath.Base(file_path)) - http.ServeFile(w, r, file_path) -} - -func (c *DownloadController) handleError(w http.ResponseWriter, err error) { - if err == domain.ErrSoftwareNotFound || err == domain.ErrNoReleasesFound { - http.Error(w, "Software not found", http.StatusNotFound) - return - } - if err == domain.ErrReleaseNotFound { - http.Error(w, "Software or release not found", http.StatusNotFound) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) -} - -func (c *DownloadController) GetLatestSource(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - release, err := c.downloadService.GetLatestRelease(name) - if err != nil { - c.handleError(w, err) - return - } - - c.serve(w, r, release, true) -} - -func (c *DownloadController) GetLatestCartridge(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - release, err := c.downloadService.GetLatestRelease(name) - if err != nil { - c.handleError(w, err) - return - } - - c.serve(w, r, release, false) -} - -func (c *DownloadController) GetSource(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - version := chi.URLParam(r, "version") - release, err := c.downloadService.GetSpecificRelease(name, version) - if err != nil { - c.handleError(w, err) - return - } - - c.serve(w, r, release, true) -} - -func (c *DownloadController) GetCartridge(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - version := chi.URLParam(r, "version") - release, err := c.downloadService.GetSpecificRelease(name, version) - if err != nil { - c.handleError(w, err) - return - } - - c.serve(w, r, release, false) -} diff --git a/apps/catalog/http/controller.play.go b/apps/catalog/http/controller.play.go deleted file mode 100644 index 42b0d98..0000000 --- a/apps/catalog/http/controller.play.go +++ /dev/null @@ -1,95 +0,0 @@ -package http - -import ( - "fmt" - "net/http" - "os" - "teletype_softwares/domain" - "teletype_softwares/lib/template_utils" - - "github.com/go-chi/chi/v5" -) - -type PlayController struct { - softwareService domain.SoftwareServiceInterface - fileService domain.FileServiceInterface -} - -func NewPlayController(software_service domain.SoftwareServiceInterface, file_service domain.FileServiceInterface) *PlayController { - return &PlayController{ - softwareService: software_service, - fileService: file_service, - } -} - -func (c *PlayController) Play(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - version := chi.URLParam(r, "version") - - software, err := c.softwareService.GetByName(name) - if err != nil { - if err == domain.ErrSoftwareNotFound { - http.Error(w, "Software not found", http.StatusNotFound) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - var web_playable_release *domain.Release - for _, release := range software.Releases { - if release.Version == version && release.HTMLFolderPath != "" { - web_playable_release = &release - break - } - } - - if web_playable_release == nil { - http.Error(w, "No web-playable version found for this software", http.StatusNotFound) - return - } - - softwares, err := c.softwareService.List() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - tmpl, err := template_utils.GetTemplate("play_controller_play", "http/views/shared/layout.html", "http/views/play/play.html") - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - tmpl.Execute(w, map[string]interface{}{ - "Software": software, - "WebPlayableRelease": web_playable_release, - "Softwares": softwares, - }) -} - -func (c *PlayController) ServeContent(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - version := chi.URLParam(r, "version") - - w.Header().Set("Cross-Origin-Opener-Policy", "same-origin") - w.Header().Set("Cross-Origin-Embedder-Policy", "require-corp") - w.Header().Set("Cross-Origin-Resource-Policy", "same-origin") - - html_base_dir := c.fileService.GetPath(name + "-" + version) - - if _, err := os.Stat(html_base_dir); os.IsNotExist(err) { - http.Error(w, fmt.Sprintf("Content for '%s' not found.", name), http.StatusNotFound) - return - } else if err != nil { - http.Error(w, fmt.Sprintf("Error accessing content for '%s': %v", name, err), http.StatusInternalServerError) - return - } - - fs := http.StripPrefix( - fmt.Sprintf("/play/%s/%s/content", name, version), - http.FileServer(http.Dir(html_base_dir)), - ) - - fs.ServeHTTP(w, r) -} diff --git a/apps/catalog/http/controller.root.go b/apps/catalog/http/controller.root.go deleted file mode 100644 index 3b9e9f4..0000000 --- a/apps/catalog/http/controller.root.go +++ /dev/null @@ -1,38 +0,0 @@ -package http - -import ( - "net/http" - - "teletype_softwares/domain" - "teletype_softwares/lib/template_utils" -) - -type RootController struct { - softwareService domain.SoftwareServiceInterface -} - -func NewRootController(softwareService domain.SoftwareServiceInterface) *RootController { - return &RootController{ - softwareService: softwareService, - } -} - -func (c *RootController) Index(w http.ResponseWriter, r *http.Request) { - softwares, err := c.softwareService.List() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - data := map[string]interface{}{ - "Softwares": softwares, - } - - tmpl, err := template_utils.GetTemplate("root_index", "http/views/shared/layout.html", "http/views/root/index.html") - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - tmpl.Execute(w, data) -} diff --git a/apps/catalog/http/controller.software.go b/apps/catalog/http/controller.software.go deleted file mode 100644 index a811726..0000000 --- a/apps/catalog/http/controller.software.go +++ /dev/null @@ -1,70 +0,0 @@ -package http - -import ( - "net/http" - - "teletype_softwares/domain" - "teletype_softwares/lib/template_utils" - - "github.com/go-chi/chi/v5" -) - -type SoftwareController struct { - softwareService domain.SoftwareServiceInterface -} - -func NewSoftwareController(software_service domain.SoftwareServiceInterface) *SoftwareController { - return &SoftwareController{softwareService: software_service} -} - -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) - return - } - - data := map[string]interface{}{ - "Softwares": softwares, - } - - tmpl, err := template_utils.GetTemplate("software_index", "http/views/shared/layout.html", "http/views/software/index.html") - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - tmpl.Execute(w, data) -} - -func (c *SoftwareController) Show(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - - showData, err := c.softwareService.GetForShowByName(name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - softwares, err := c.softwareService.List() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - data := map[string]interface{}{ - "Software": showData.Software, - "Releases": showData.Releases, - "LatestRelease": showData.LatestRelease, - "WebPlayableRelease": showData.WebPlayableRelease, - "Softwares": softwares, - } - - 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, data) - -} diff --git a/apps/catalog/http/http.go b/apps/catalog/http/http.go index 9429a23..82cbba6 100755 --- a/apps/catalog/http/http.go +++ b/apps/catalog/http/http.go @@ -8,12 +8,7 @@ import ( func StartHttpServer(domain_instance domain.Domain) { router := NewRouter( NewAPISoftwareController(domain_instance.SoftwareService), - NewSoftwareController(domain_instance.SoftwareService), NewSoftwareUpdaterController(domain_instance.SoftwareUpdaterService, domain_instance.SoftwareService), - NewDownloadController(domain_instance.DownloadService, domain_instance.SoftwareService), - NewPlayController(domain_instance.SoftwareService, domain_instance.FileService), - NewRootController(domain_instance.SoftwareService), - NewDocsController(domain_instance.SoftwareService, domain_instance.FileService), ).Init() http_utils.StartGenericHTTPServer(http_utils.StartGenericHTTPServerContext{ diff --git a/apps/catalog/http/router.go b/apps/catalog/http/router.go index eccdef5..2a1837c 100755 --- a/apps/catalog/http/router.go +++ b/apps/catalog/http/router.go @@ -8,31 +8,16 @@ import ( type Router struct { apiSoftwareController *APISoftwareController - softwareController *SoftwareController softwareUpdaterController *SoftwareUpdaterController - downloadController *DownloadController - playController *PlayController - rootController *RootController - docsController *DocsController } func NewRouter( api_software_controller *APISoftwareController, - software_controller *SoftwareController, software_updater_controller *SoftwareUpdaterController, - download_controller *DownloadController, - play_controller *PlayController, - root_controller *RootController, - docs_controller *DocsController, ) *Router { return &Router{ apiSoftwareController: api_software_controller, - softwareController: software_controller, softwareUpdaterController: software_updater_controller, - downloadController: download_controller, - playController: play_controller, - rootController: root_controller, - docsController: docs_controller, } } @@ -40,25 +25,8 @@ func (r *Router) Init() *chi.Mux { router := chi.NewRouter() router.Use(CORSMiddleware) - router.Get("/", r.rootController.Index) - router.Get("/api/software", r.apiSoftwareController.Index) - - router.Get("/software", r.softwareController.Index) - router.Get("/software/{name}", r.softwareController.Show) - 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) - router.Get("/download/{name}/{version}/cartridge", r.downloadController.GetCartridge) - router.Get("/play/{name}/{version}", r.playController.Play) - router.Get("/play/{name}/{version}/content*", r.playController.ServeContent) - router.Get("/docs/{name}/{version}", r.docsController.ServeDocs) - router.Get("/docs/{name}/{version}/*", r.docsController.ServeDocs) - - fs_assets := http.FileServer(http.Dir("assets")) - router.Handle("/assets/*", http.StripPrefix("/assets/", fs_assets)) fs_file := http.FileServer(http.Dir("/softwares")) router.Handle("/file/*", http.StripPrefix("/file/", fs_file)) diff --git a/apps/catalog/http/views/play/play.html b/apps/catalog/http/views/play/play.html deleted file mode 100644 index 22e57cb..0000000 --- a/apps/catalog/http/views/play/play.html +++ /dev/null @@ -1,77 +0,0 @@ -{{define "content"}} -

Play {{.Software.Title}}

- -
- -
- -
-
- Back to Releases - {{if .WebPlayableRelease.DocsFolderPath}} - Docs - {{end}} - -
-
- -
-

Version

-

{{.WebPlayableRelease.Version}}

-

Other Versions

-
- {{range .Software.Releases}} - {{if and .WebPlayable (ne .Version $.WebPlayableRelease.Version)}} - - {{.Version}} - - {{end}} - {{end}} -
-
- - - -{{end}} diff --git a/apps/catalog/http/views/root/index.html b/apps/catalog/http/views/root/index.html deleted file mode 100644 index 1821947..0000000 --- a/apps/catalog/http/views/root/index.html +++ /dev/null @@ -1,8 +0,0 @@ -{{define "content"}} -

Welcome

- -

- Welcome to Teletype Games! We are an independent, community-driven game development collective. Our mission is to create small, experimental, and full-fledged games in short development cycles while keeping everything open, transparent, and collaborative. -

- -{{end}} diff --git a/apps/catalog/http/views/shared/layout.html b/apps/catalog/http/views/shared/layout.html deleted file mode 100644 index 81d5994..0000000 --- a/apps/catalog/http/views/shared/layout.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - Teletype Games - - - - - - - -
-
-
-
- -
-
-
-
- {{block "content" .}}{{end}} -
-
-
-
- - - - - - - diff --git a/apps/catalog/http/views/software/index.html b/apps/catalog/http/views/software/index.html deleted file mode 100644 index c596d00..0000000 --- a/apps/catalog/http/views/software/index.html +++ /dev/null @@ -1,15 +0,0 @@ -{{define "content"}} -

Softwares

- -
-
- -
-
-{{end}} \ No newline at end of file diff --git a/apps/catalog/http/views/software/show.html b/apps/catalog/http/views/software/show.html deleted file mode 100644 index ef8980b..0000000 --- a/apps/catalog/http/views/software/show.html +++ /dev/null @@ -1,100 +0,0 @@ -{{define "content"}} -

{{.Software.Title}}

- -
- {{if .WebPlayableRelease}} -
-
-
-

Play

-
-
-
- -
-
- -
-
- {{end}} -
-
-
-

Overview

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Title{{.Software.Title}}
Author{{.Software.Author}}
Description{{.Software.Desc}}
Version{{.LatestRelease.Version}}
License{{.Software.License}}
Website{{.Software.Site}}
-
- -
-
-
- -

Releases

-
- {{range .Releases}} -
-
-
-
Version: {{.Version}}
-

Released At: {{.CreatedAt.Format "2006-01-02 15:04:05"}}

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