Skip to content

Commit 7098474

Browse files
committed
PR feedback
1 parent c217093 commit 7098474

File tree

3 files changed

+68
-79
lines changed

3 files changed

+68
-79
lines changed

storage/sql_migrations/003_did.sql

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ create table did
1111

1212
create index did_subject_idx on did (subject);
1313

14-
create table did_document
14+
create table did_document_version
1515
(
1616
-- id is v4 uuid
1717
id varchar(36) not null primary key,
@@ -31,7 +31,7 @@ create table did_verificationmethod
3131
-- data is a JSON object containing the verification method data, e.g. the public key.
3232
-- When producing the verificationMethod, data is used as JSON base object and the id and type are added.
3333
data $TEXT_TYPE not null,
34-
foreign key (did_document_id) references did_document (id) on delete cascade
34+
foreign key (did_document_id) references did_document_version (id) on delete cascade
3535
);
3636

3737
-- this table is used to store the services for locally managed DIDs
@@ -44,10 +44,11 @@ create table did_service
4444
-- data is a JSON object containing the service data, e.g. the serviceEndpoint.
4545
-- When producing the service, data is used as JSON base object and the id and type are added.
4646
data $TEXT_TYPE not null,
47-
foreign key (did_document_id) references did_document (id) on delete cascade
47+
foreign key (did_document_id) references did_document_version (id) on delete cascade
4848
);
4949

5050
-- +goose Down
51-
drop table did;
5251
drop table did_verificationmethod;
53-
drop table did_service;
52+
drop table did_service;
53+
drop table did_document_version;
54+
drop table did;

vdr/didweb/manager.go

Lines changed: 60 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ var _ management.DocumentManager = (*Manager)(nil)
5151
// NewManager creates a new Manager to create and update did:web DID documents.
5252
func NewManager(rootDID did.DID, tenantPath string, keyStore crypto.KeyStore, db *gorm.DB) *Manager {
5353
return &Manager{
54-
db: db,
55-
//store: &sqlStore{db: db},
54+
db: db,
5655
rootDID: rootDID,
5756
tenantPath: tenantPath,
5857
keyStore: keyStore,
@@ -80,9 +79,6 @@ func (m Manager) Deactivate(ctx context.Context, subjectDID did.DID) error {
8079
}
8180
return err
8281
}
83-
if sqlDocument == nil {
84-
return nil
85-
}
8682
err = didStore.Delete(subjectDID)
8783
if err != nil {
8884
return err
@@ -129,46 +125,47 @@ func (m Manager) Create(ctx context.Context, opts management.CreationOptions) (*
129125
if err != nil {
130126
return nil, nil, fmt.Errorf("parse new DID: %w", err)
131127
}
132-
tx := m.db.Begin()
133-
defer tx.Rollback()
128+
var document did.Document
129+
var verificationMethodKey crypto.Key
130+
err = m.db.Transaction(func(tx *gorm.DB) error {
131+
var verificationMethod *did.VerificationMethod
132+
documentStore := sql.NewDIDDocumentManager(tx)
134133

135-
documentStore := sql.NewDIDDocumentManager(tx)
134+
_, err = documentStore.Latest(*newDID)
135+
if err == nil {
136+
return management.ErrDIDAlreadyExists
137+
}
138+
if !errors.Is(err, gorm.ErrRecordNotFound) {
139+
return err
140+
}
136141

137-
_, err = documentStore.Latest(*newDID)
138-
if err == nil {
139-
return nil, nil, management.ErrDIDAlreadyExists
140-
}
141-
if !errors.Is(err, gorm.ErrRecordNotFound) {
142-
return nil, nil, err
143-
}
142+
verificationMethodKey, verificationMethod, err = m.createVerificationMethod(ctx, *newDID)
143+
if err != nil {
144+
return err
145+
}
146+
vmAsJson, err := json.Marshal(verificationMethod)
147+
if err != nil {
148+
return err
149+
}
144150

145-
verificationMethodKey, verificationMethod, err := m.createVerificationMethod(ctx, *newDID)
146-
if err != nil {
147-
return nil, nil, err
148-
}
149-
vmAsJson, err := json.Marshal(verificationMethod)
150-
if err != nil {
151-
return nil, nil, err
152-
}
151+
sqlDid := sql.DID{
152+
ID: newDID.String(),
153+
Subject: newDID.String(), // todo pass through options
154+
}
155+
var doc *sql.DIDDocument
156+
if doc, err = documentStore.CreateOrUpdate(sqlDid, []sql.SqlVerificationMethod{{
157+
ID: verificationMethod.ID.String(),
158+
DIDDocumentID: sqlDid.ID,
159+
Data: vmAsJson,
160+
}}, nil); err != nil {
161+
return fmt.Errorf("store new DID document: %w", err)
162+
}
153163

154-
sqlDid := sql.DID{
155-
ID: newDID.String(),
156-
Subject: newDID.String(),
157-
}
158-
var doc *sql.DIDDocument
159-
if doc, err = documentStore.CreateOrUpdate(sqlDid, []sql.SqlVerificationMethod{{
160-
ID: verificationMethod.ID.String(),
161-
DIDDocumentID: sqlDid.ID,
162-
Data: vmAsJson,
163-
}}, nil); err != nil {
164-
return nil, nil, fmt.Errorf("store new DID document: %w", err)
165-
}
164+
document, err = buildDocument(*newDID, *doc)
165+
return err
166+
})
166167

167-
document, err := buildDocument(*newDID, *doc)
168-
if err != nil {
169-
return nil, nil, err
170-
}
171-
return &document, verificationMethodKey, tx.Commit().Error
168+
return &document, verificationMethodKey, err
172169
}
173170

174171
func (m Manager) createVerificationMethod(ctx context.Context, ownerDID did.DID) (crypto.Key, *did.VerificationMethod, error) {
@@ -230,15 +227,14 @@ func (m Manager) ListOwned(_ context.Context) ([]did.DID, error) {
230227
}
231228

232229
func (m Manager) CreateService(_ context.Context, subjectDID did.DID, service did.Service) (*did.Service, error) {
233-
tx := m.db.Begin()
234-
defer tx.Rollback()
235-
236-
added, err := m.createService(tx, subjectDID, service)
237-
if err != nil {
238-
return nil, err
239-
}
230+
var err error
231+
var added *did.Service
232+
err = m.db.Transaction(func(tx *gorm.DB) error {
233+
added, err = m.createService(tx, subjectDID, service)
234+
return err
235+
})
240236

241-
return added, tx.Commit().Error
237+
return added, err
242238
}
243239

244240
func (m Manager) createService(tx *gorm.DB, subjectDID did.DID, service did.Service) (*did.Service, error) {
@@ -277,35 +273,27 @@ func (m Manager) UpdateService(_ context.Context, subjectDID did.DID, serviceID
277273
// ID not set in new version of the service, use the provided serviceID
278274
service.ID = serviceID
279275
}
280-
281-
tx := m.db.Begin()
282-
defer tx.Rollback()
283-
284-
// first delete
285-
err := m.deleteService(tx, subjectDID, serviceID)
286-
if err != nil {
287-
return nil, err
288-
}
289-
// then add
290-
added, err := m.createService(tx, subjectDID, service)
291-
if err != nil {
292-
return nil, err
293-
}
276+
var added *did.Service
277+
var err error
278+
err = m.db.Transaction(func(tx *gorm.DB) error {
279+
// first delete
280+
err := m.deleteService(tx, subjectDID, serviceID)
281+
if err != nil {
282+
return err
283+
}
284+
// then add
285+
added, err = m.createService(tx, subjectDID, service)
286+
return err
287+
})
294288

295289
//commit and return
296-
return added, tx.Commit().Error
290+
return added, err
297291
}
298292

299293
func (m Manager) DeleteService(_ context.Context, subjectDID did.DID, serviceID ssi.URI) error {
300-
tx := m.db.Begin()
301-
defer tx.Rollback()
302-
303-
err := m.deleteService(tx, subjectDID, serviceID)
304-
if err != nil {
305-
return err
306-
}
307-
308-
return tx.Commit().Error
294+
return m.db.Transaction(func(tx *gorm.DB) error {
295+
return m.deleteService(tx, subjectDID, serviceID)
296+
})
309297
}
310298

311299
func (m Manager) deleteService(tx *gorm.DB, subjectDID did.DID, serviceID ssi.URI) error {

vdr/sql/did_document.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"gorm.io/gorm/schema"
2828
)
2929

30-
// DIDDocument is the gorm representation of the DID table
30+
// DIDDocument is the gorm representation of the did_document_version table
3131
type DIDDocument struct {
3232
ID string `gorm:"primaryKey"`
3333
DidID string `gorm:"column:did"`
@@ -38,7 +38,7 @@ type DIDDocument struct {
3838
}
3939

4040
func (d DIDDocument) TableName() string {
41-
return "did_document"
41+
return "did_document_version"
4242
}
4343

4444
var _ DIDDocumentManager = (*SqlDIDDocumentManager)(nil)

0 commit comments

Comments
 (0)