github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/interface/http/index.go (about) 1 package http 2 3 import ( 4 "fmt" 5 "net/http" 6 "strings" 7 8 "github.com/morikuni/failure" 9 10 "github.com/oinume/lekcije/backend/context_data" 11 "github.com/oinume/lekcije/backend/domain/config" 12 ) 13 14 var _ = fmt.Print 15 16 func (s *server) static(w http.ResponseWriter, r *http.Request) { 17 http.ServeFile(w, r, r.URL.Path[1:]) 18 } 19 20 func (s *server) indexHandler() http.HandlerFunc { 21 return func(w http.ResponseWriter, r *http.Request) { 22 if _, err := context_data.GetLoggedInUser(r.Context()); err == nil { 23 http.Redirect(w, r, "/me", http.StatusFound) 24 } else { 25 s.indexLogout(w, r) 26 } 27 } 28 } 29 30 func (s *server) index(w http.ResponseWriter, r *http.Request) { 31 if _, err := context_data.GetLoggedInUser(r.Context()); err == nil { 32 http.Redirect(w, r, "/me", http.StatusFound) 33 } else { 34 s.indexLogout(w, r) 35 } 36 } 37 38 func (s *server) indexLogout(w http.ResponseWriter, r *http.Request) { 39 t := ParseHTMLTemplates(TemplatePath("index.html")) 40 type Data struct { 41 commonTemplateData 42 } 43 data := &Data{ 44 commonTemplateData: s.getCommonTemplateData(r, false, 0), 45 } 46 47 if err := t.Execute(w, data); err != nil { 48 e := failure.Wrap(err, failure.Messagef("failed to template.Execute()")) 49 internalServerError(r.Context(), s.errorRecorder, w, e, 0) 50 return 51 } 52 } 53 54 func (s *server) signupHandler() http.HandlerFunc { 55 return func(w http.ResponseWriter, r *http.Request) { 56 s.signup(w, r) 57 } 58 } 59 60 func (s *server) signup(w http.ResponseWriter, r *http.Request) { 61 if _, err := context_data.GetLoggedInUser(r.Context()); err == nil { 62 http.Redirect(w, r, "/me", http.StatusFound) 63 return 64 } 65 66 t := ParseHTMLTemplates(TemplatePath("signup.html")) 67 data := struct { 68 commonTemplateData 69 }{ 70 commonTemplateData: s.getCommonTemplateData(r, false, 0), 71 } 72 if err := t.Execute(w, &data); err != nil { 73 e := failure.Wrap(err, failure.Messagef("failed to template.Execute()")) 74 internalServerError(r.Context(), s.errorRecorder, w, e, 0) 75 return 76 } 77 } 78 79 func (s *server) robotsTxtHandler() http.HandlerFunc { 80 return func(w http.ResponseWriter, r *http.Request) { 81 s.robotsTxt(w, r) 82 } 83 } 84 85 func (s *server) robotsTxt(w http.ResponseWriter, r *http.Request) { 86 content := fmt.Sprintf(` 87 User-agent: * 88 Allow: / 89 Sitemap: %s/sitemap.xml 90 `, config.WebURL()) 91 w.Header().Set("Content-Type", "text/plain; charset=utf-8") 92 w.WriteHeader(http.StatusOK) 93 fmt.Fprintln(w, strings.TrimSpace(content)) 94 } 95 96 func (s *server) sitemapXMLHandler() http.HandlerFunc { 97 return func(w http.ResponseWriter, r *http.Request) { 98 s.sitemapXML(w, r) 99 } 100 } 101 102 func (s *server) sitemapXML(w http.ResponseWriter, r *http.Request) { 103 // TODO: Move to an external file 104 content := fmt.Sprintf(` 105 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 106 <url> 107 <loc>%s/</loc> 108 <priority>1.0</priority> 109 </url> 110 <url> 111 <loc>%s/signup</loc> 112 <priority>1.0</priority> 113 </url> 114 <url> 115 <loc>%s/terms</loc> 116 <priority>1.0</priority> 117 </url> 118 </urlset> 119 `, config.WebURL(), config.WebURL(), config.WebURL()) 120 w.Header().Set("Content-Type", "text/xml; charset=utf-8") 121 w.WriteHeader(http.StatusOK) 122 fmt.Fprintln(w, strings.TrimSpace(content)) 123 } 124 125 func (s *server) termsHandler() http.HandlerFunc { 126 return func(w http.ResponseWriter, r *http.Request) { 127 s.terms(w, r) 128 } 129 } 130 131 func (s *server) terms(w http.ResponseWriter, r *http.Request) { 132 t := ParseHTMLTemplates(TemplatePath("terms.html")) 133 type Data struct { 134 commonTemplateData 135 } 136 137 userID := uint32(0) 138 if user, err := context_data.GetLoggedInUser(r.Context()); err == nil { 139 userID = user.ID 140 } 141 data := &Data{ 142 commonTemplateData: s.getCommonTemplateData(r, false, userID), 143 } 144 145 if err := t.Execute(w, data); err != nil { 146 e := failure.Wrap(err, failure.Messagef("failed to template.Execute()")) 147 internalServerError(r.Context(), s.errorRecorder, w, e, 0) 148 return 149 } 150 }