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  }