forked from short-d/short
-
Notifications
You must be signed in to change notification settings - Fork 1
/
githubsso.go
89 lines (81 loc) · 2.09 KB
/
githubsso.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
package sqldb
import (
"database/sql"
"fmt"
"github.com/short-d/app/fw/logger"
"github.com/primedata-ai/short/backend/app/adapter/sqldb/table"
"github.com/primedata-ai/short/backend/app/usecase/repository"
)
var _ repository.SSOMap = (*GithubSSOSql)(nil)
// GithubSSOSql accesses mapping between Github and Short accounts in the
// SQL database.
type GithubSSOSql struct {
db *sql.DB
logger logger.Logger
}
// GetShortUserID retrieves the internal user ID that is linked to the user's
// Github account.
func (g GithubSSOSql) GetShortUserID(ssoUserID string) (string, error) {
query := fmt.Sprintf(`
SELECT "%s"
FROM "%s"
WHERE "%s"=$1;
`,
table.GithubSSO.ColumnShortUserID,
table.GithubSSO.TableName,
table.GithubSSO.ColumnGithubUserID,
)
var id string
err := g.db.QueryRow(query, ssoUserID).Scan(&id)
if err == nil {
return id, err
}
if err == sql.ErrNoRows {
return "", repository.ErrEntryNotFound(
fmt.Sprintf("user with Github ID %s not found", ssoUserID),
)
}
g.logger.Error(err)
return "", err
}
// IsSSOUserExist checks whether mapping for a given Github account exists in
// the database.
func (g GithubSSOSql) IsSSOUserExist(ssoUserID string) (bool, error) {
query := fmt.Sprintf(`
SELECT "%s"
FROM "%s"
WHERE "%s"=$1;
`,
table.GithubSSO.ColumnGithubUserID,
table.GithubSSO.TableName,
table.GithubSSO.ColumnGithubUserID,
)
var id string
err := g.db.QueryRow(query, ssoUserID).Scan(&id)
if err == nil {
return true, err
}
if err == sql.ErrNoRows {
return false, nil
}
g.logger.Error(err)
return false, err
}
// CreateMapping links user's Github and Short accounts in the
// database.
func (g GithubSSOSql) CreateMapping(ssoUserID string, userID string) error {
statement := fmt.Sprintf(`
INSERT INTO "%s" ("%s", "%s")
VALUES ($1, $2);
`,
table.GithubSSO.TableName,
table.GithubSSO.ColumnGithubUserID,
table.GithubSSO.ColumnShortUserID,
)
_, err := g.db.Exec(statement, ssoUserID, userID)
return err
}
// NewGithubSSOSql creates GithubSSOSql.
func NewGithubSSOSql(db *sql.DB, logger logger.Logger) GithubSSOSql {
return GithubSSOSql{db: db, logger: logger}
}