This repository has been archived by the owner on Jan 4, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lastfm.go
98 lines (81 loc) · 2.57 KB
/
lastfm.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package lastfm
import (
"net/http"
"time"
"github.com/astralservices/api/utils"
"github.com/gofiber/fiber/v2"
"github.com/markbates/goth"
"github.com/nedpals/supabase-go"
)
type LastfmProvider struct {
ctx *fiber.Ctx
database *supabase.Client
user goth.User
redirect string
domain string
}
func New(c *fiber.Ctx, database *supabase.Client, user goth.User, redirect string, domain string) LastfmProvider {
provider := LastfmProvider{
ctx: c,
database: database,
user: user,
redirect: redirect,
domain: domain,
}
return provider
}
func (p LastfmProvider) CreateUser() error {
ctx, database, user, redirect := p.ctx, p.database, p.user, p.redirect
discordUser := ctx.Locals("user").(utils.IProvider)
var out []utils.IProvider
insertErr := database.DB.From("providers").Insert(map[string]interface{}{
"type": user.Provider,
"user": discordUser.ID,
"provider_id": user.Name,
"provider_access_token": user.AccessToken,
"provider_refresh_token": user.RefreshToken,
"provider_expires_at": user.ExpiresAt.UTC(),
"provider_data": user.RawData,
"provider_avatar_url": &user.AvatarURL,
"provider_email": &user.Email,
"updated_at": time.Now().UTC(),
}).Execute(&out)
if insertErr != nil {
return utils.ErrorResponse(ctx, 500, insertErr, false)
}
if redirect != "" {
ctx.ClearCookie("redirect")
return ctx.Redirect(redirect)
}
return ctx.Status(200).JSON(utils.Response[any]{
Result: out,
Code: http.StatusOK,
})
}
func (p LastfmProvider) UpdateUser() error {
ctx, database, user, redirect := p.ctx, p.database, p.user, p.redirect
var out []utils.IProvider
discordUser := ctx.Locals("user").(utils.IProvider)
insertErr := database.DB.From("providers").Update(map[string]interface{}{
"type": user.Provider,
"provider_id": user.UserID,
"provider_access_token": user.AccessToken,
"provider_refresh_token": user.RefreshToken,
"provider_expires_at": user.ExpiresAt.UTC(),
"provider_data": user.RawData,
"provider_avatar_url": &user.AvatarURL,
"provider_email": &user.Email,
"updated_at": time.Now().UTC(),
}).Eq("provider_id", user.UserID).Eq("type", user.Provider).Eq("user", *discordUser.ID).Execute(&out)
if insertErr != nil {
return utils.ErrorResponse(ctx, 500, insertErr, false)
}
if redirect != "" {
ctx.ClearCookie("redirect")
return ctx.Redirect(redirect)
}
return ctx.Status(200).JSON(utils.Response[any]{
Result: out,
Code: http.StatusOK,
})
}