diff --git a/main.go b/main.go index 7575014..5950ec6 100644 --- a/main.go +++ b/main.go @@ -342,34 +342,54 @@ func query() int32 { } func initializeDatabase(credentialBytes []byte) (string, error) { - // TODO: Initialize SQLite database with schema - // TODO: Parse WebAuthn credential - // TODO: Generate MPC key shares - // TODO: Create DID document - // TODO: Insert initial records + conn, err := openDatabase() + if err != nil { + return "", fmt.Errorf("open database: %w", err) + } did := fmt.Sprintf("did:sonr:%x", credentialBytes[:16]) + docJSON := fmt.Sprintf(`{"@context":["https://www.w3.org/ns/did/v1"],"id":"%s"}`, did) + _, err = conn.Exec( + "INSERT INTO did_documents (did, controller, document, sequence) VALUES (?, ?, ?, ?)", + did, did, docJSON, 0, + ) + if err != nil { + return "", fmt.Errorf("insert DID: %w", err) + } + pdk.Log(pdk.LogDebug, "initializeDatabase: created schema and initial records") return did, nil } func serializeDatabase() ([]byte, error) { - // TODO: Serialize SQLite database to bytes - // TODO: Encrypt with WebAuthn-derived key - return []byte("placeholder_database"), nil + data, err := serializeDatabaseBytes() + if err != nil { + return nil, fmt.Errorf("serialize: %w", err) + } + return data, nil } func loadDatabase(data []byte) (string, error) { - // TODO: Decrypt database with WebAuthn-derived key - // TODO: Load SQLite database from bytes - // TODO: Query for primary DID - if len(data) < 10 { return "", errors.New("invalid database format") } - did := "did:sonr:loaded" + if err := loadDatabaseFromBytes(data); err != nil { + return "", fmt.Errorf("load database: %w", err) + } + + conn := getDatabase() + if conn == nil { + return "", errors.New("database not initialized") + } + + var did string + err := conn.QueryRow("SELECT did FROM did_documents LIMIT 1").Scan(&did) + if err != nil { + return "", fmt.Errorf("query DID: %w", err) + } + pdk.Log(pdk.LogDebug, "loadDatabase: database loaded successfully") return did, nil }