/
auth.go
77 lines (72 loc) · 2.37 KB
/
auth.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
package handlers
import (
"fmt"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/dgrijalva/jwt-go"
"go.mongodb.org/mongo-driver/bson/primitive"
"github.com/daystram/cast/cast-be/config"
"github.com/daystram/cast/cast-be/constants"
"github.com/daystram/cast/cast-be/datatransfers"
)
func (m *module) Register(idToken datatransfers.UserRegister) (err error) {
var user datatransfers.User
if user, err = parseIDToken(idToken.IDToken); err != nil {
fmt.Printf("[Register] Failed parsing id_token. %+v\n", err)
return
}
exists := false
if err = m.db.userOrm.CheckUnique("_id", user.ID); err != nil {
exists = true
}
if err = m.db.userOrm.CheckUnique("username", user.Username); err != nil { // double check
exists = true
}
if exists {
if err = m.db.userOrm.UpdateUser(user); err != nil {
fmt.Printf("[Register] Failed updating user entry. %+v\n", err)
return
}
} else {
if err = m.db.userOrm.InsertUser(user); err != nil {
fmt.Printf("[Register] Failed adding %s user entry. %+v\n", user.Username, err)
return
}
if _, err = m.db.videoOrm.InsertVideo(datatransfers.VideoInsert{
ID: primitive.NewObjectID(),
Hash: user.Username,
Type: constants.VideoTypeLive,
Author: user.ID,
Title: fmt.Sprintf("%s's Livestream", user.Username),
Tags: []string{"live", "first"},
Description: "Welcome to my stream!",
Resolutions: -1,
IsLive: false,
Unlisted: false,
}); err != nil {
_ = m.db.userOrm.DeleteOneByID(user.ID)
fmt.Printf("[Register] Failed adding %s live video entry. %+v\n", user.Username, err)
return
}
_, _ = m.s3.CopyObject(&s3.CopyObjectInput{
Bucket: aws.String(config.AppConfig.S3Bucket),
CopySource: aws.String(fmt.Sprintf("%s/%s.jpg", config.AppConfig.S3Bucket, constants.ThumbnailDefault)),
Key: aws.String(fmt.Sprintf("%s/%s.jpg", constants.ThumbnailRootDir, user.Username)),
})
}
return
}
func parseIDToken(idToken string) (user datatransfers.User, err error) {
claims := jwt.MapClaims{}
if _, _, err = new(jwt.Parser).ParseUnverified(idToken, claims); err != nil {
return
}
user = datatransfers.User{
ID: claims["sub"].(string),
Username: claims["preferred_username"].(string),
Name: fmt.Sprintf("%s %s", claims["given_name"], claims["family_name"]),
CreatedAt: time.Now(),
}
return
}