Live video on the AT Protocol
1package model
2
3import (
4 "context"
5 "errors"
6 "fmt"
7 "time"
8
9 "go.opentelemetry.io/otel"
10 "gorm.io/gorm"
11)
12
13type SigningKey struct {
14 DID string `gorm:"primaryKey;column:did" json:"did"`
15 RepoDID string `gorm:"primaryKey;column:repo_did" json:"repoDID"`
16 RKey string `gorm:"column:rkey;index" json:"rkey"`
17 Repo *Repo `json:"repo,omitempty" gorm:"foreignKey:RepoDID;references:DID"`
18 CreatedAt time.Time `json:"createdAt"`
19 RevokedAt *time.Time `json:"revokedAt"`
20}
21
22func (SigningKey) TableName() string {
23 return "signing_keys"
24}
25
26func (m *DBModel) UpdateSigningKey(key *SigningKey) error {
27 return m.DB.Save(key).Error
28}
29
30func (m *DBModel) GetSigningKey(ctx context.Context, did, repoDID string) (*SigningKey, error) {
31 _, span := otel.Tracer("signer").Start(ctx, "GetSigningKey")
32 defer span.End()
33 var key SigningKey
34 res := m.DB.Model(SigningKey{}).Where("did = ?", did).Where("repo_did = ?", repoDID).First(&key)
35 if errors.Is(res.Error, gorm.ErrRecordNotFound) {
36 return nil, nil
37 }
38 if key.RevokedAt != nil {
39 return nil, fmt.Errorf("signing key revoked")
40 }
41 if res.Error != nil {
42 return nil, res.Error
43 }
44 return &key, nil
45}
46
47func (m *DBModel) GetSigningKeyByRKey(ctx context.Context, rkey string) (*SigningKey, error) {
48 _, span := otel.Tracer("signer").Start(ctx, "GetSigningKeyByRKey")
49 defer span.End()
50 var key SigningKey
51 res := m.DB.Model(SigningKey{}).Where("rkey = ?", rkey).First(&key)
52 if errors.Is(res.Error, gorm.ErrRecordNotFound) {
53 return nil, nil
54 }
55 if key.RevokedAt != nil {
56 return nil, fmt.Errorf("signing key revoked")
57 }
58 if res.Error != nil {
59 return nil, res.Error
60 }
61 return &key, nil
62}
63
64func (m *DBModel) GetSigningKeysForRepo(repoDID string) ([]SigningKey, error) {
65 var keys []SigningKey
66 res := m.DB.Model(SigningKey{}).Where("repo_did = ?", repoDID).Find(&keys)
67 if res.Error != nil {
68 return nil, res.Error
69 }
70 return keys, nil
71}