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  }