1package server
2
3import (
4 "github.com/haileyok/cocoon/internal/helpers"
5 "github.com/haileyok/cocoon/models"
6 "github.com/labstack/echo/v4"
7)
8
9type ComAtprotoServerRefreshSessionResponse struct {
10 AccessJwt string `json:"accessJwt"`
11 RefreshJwt string `json:"refreshJwt"`
12 Handle string `json:"handle"`
13 Did string `json:"did"`
14 Active bool `json:"active"`
15 Status *string `json:"status,omitempty"`
16}
17
18func (s *Server) handleRefreshSession(e echo.Context) error {
19 ctx := e.Request().Context()
20
21 token := e.Get("token").(string)
22 repo := e.Get("repo").(*models.RepoActor)
23
24 if err := s.db.Exec(ctx, "DELETE FROM refresh_tokens WHERE token = ?", nil, token).Error; err != nil {
25 s.logger.Error("error getting refresh token from db", "error", err)
26 return helpers.ServerError(e, nil)
27 }
28
29 if err := s.db.Exec(ctx, "DELETE FROM tokens WHERE refresh_token = ?", nil, token).Error; err != nil {
30 s.logger.Error("error deleting access token from db", "error", err)
31 return helpers.ServerError(e, nil)
32 }
33
34 sess, err := s.createSession(ctx, &repo.Repo)
35 if err != nil {
36 s.logger.Error("error creating new session for refresh", "error", err)
37 return helpers.ServerError(e, nil)
38 }
39
40 return e.JSON(200, ComAtprotoServerRefreshSessionResponse{
41 AccessJwt: sess.AccessToken,
42 RefreshJwt: sess.RefreshToken,
43 Handle: repo.Handle,
44 Did: repo.Repo.Did,
45 Active: repo.Active(),
46 Status: repo.Status(),
47 })
48}