github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/interface/http/me.go (about) 1 package http 2 3 import ( 4 "fmt" 5 "net/http" 6 7 "github.com/morikuni/failure" 8 "go.opentelemetry.io/otel" 9 10 "github.com/oinume/lekcije/backend/context_data" 11 "github.com/oinume/lekcije/backend/model2" 12 ) 13 14 var _ = fmt.Printf 15 16 func (s *server) getMeHandler() http.HandlerFunc { 17 return func(w http.ResponseWriter, r *http.Request) { 18 s.getMe(w, r) 19 } 20 } 21 22 func (s *server) getMe(w http.ResponseWriter, r *http.Request) { 23 ctx := r.Context() 24 tracer := otel.GetTracerProvider().Tracer("http") 25 ctx, span := tracer.Start(ctx, "getMe") 26 defer span.End() 27 28 user := context_data.MustLoggedInUser(ctx) 29 t := ParseHTMLTemplates(TemplatePath("me/index.html")) 30 type Data struct { 31 commonTemplateData 32 Email string 33 } 34 data := &Data{ 35 commonTemplateData: s.getCommonTemplateData(r, true, user.ID), 36 Email: user.Email, 37 } 38 if err := t.Execute(w, data); err != nil { 39 e := failure.Wrap(err, failure.Messagef("failed to template.Execute()")) 40 internalServerError(r.Context(), s.errorRecorder, w, e, user.ID) 41 return 42 } 43 } 44 45 func (s *server) getMeSetting(w http.ResponseWriter, r *http.Request) { 46 ctx := r.Context() 47 user := context_data.MustLoggedInUser(ctx) 48 t := ParseHTMLTemplates(TemplatePath("me/setting.html")) 49 type Data struct { 50 commonTemplateData 51 Email string 52 } 53 data := &Data{ 54 commonTemplateData: s.getCommonTemplateData(r, true, user.ID), 55 Email: user.Email, 56 } 57 58 if err := t.Execute(w, data); err != nil { 59 e := failure.Wrap(err, failure.Messagef("failed to template.Execute()")) 60 internalServerError(r.Context(), s.errorRecorder, w, e, user.ID) 61 return 62 } 63 } 64 65 func (s *server) getMeLogout(w http.ResponseWriter, r *http.Request) { 66 ctx := r.Context() 67 user, err := context_data.GetLoggedInUser(ctx) 68 if err != nil { 69 http.Redirect(w, r, "/", http.StatusFound) 70 return 71 } 72 73 cookie, err := r.Cookie(APITokenCookieName) 74 if err != nil { 75 e := failure.Wrap(err, failure.Messagef("failed to get token cookie")) 76 internalServerError(r.Context(), s.errorRecorder, w, e, user.ID) 77 return 78 } 79 token := cookie.Value 80 cookieToDelete := &http.Cookie{ 81 Name: APITokenCookieName, 82 Value: "", 83 Path: "/", 84 MaxAge: -1, 85 HttpOnly: false, 86 } 87 http.SetCookie(w, cookieToDelete) 88 if err := s.userAPITokenUsecase.DeleteByUserIDAndToken(ctx, uint(user.ID), token); err != nil { 89 internalServerError(r.Context(), s.errorRecorder, w, err, user.ID) 90 return 91 } 92 go s.sendGAMeasurementEvent( 93 r.Context(), 94 model2.GAMeasurementEventCategoryUser, 95 "logout", 96 fmt.Sprint(user.ID), 97 0, 98 user.ID, 99 ) 100 http.Redirect(w, r, "/", http.StatusFound) 101 }