Diffdown is a real-time collaborative Markdown editor/previewer built on the AT Protocol diffdown.com

feat: add DID field to User model and GetUserByDID DB method

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

+30 -17
+21 -9
internal/db/db.go
··· 66 66 u.ID = NewID() 67 67 u.CreatedAt = time.Now() 68 68 _, err := db.Exec( 69 - `INSERT INTO users (id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, created_at) 70 - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, 71 - u.ID, u.Name, u.Email, u.PasswordHash, u.AvatarURL, u.OAuthProvider, u.OAuthID, u.CreatedAt, 69 + `INSERT INTO users (id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, did, created_at) 70 + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, 71 + u.ID, u.Name, u.Email, u.PasswordHash, u.AvatarURL, u.OAuthProvider, u.OAuthID, u.DID, u.CreatedAt, 72 72 ) 73 73 return err 74 74 } ··· 76 76 func (db *DB) GetUserByID(id string) (*model.User, error) { 77 77 u := &model.User{} 78 78 err := db.QueryRow( 79 - `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, created_at 79 + `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, did, created_at 80 80 FROM users WHERE id = ?`, id, 81 - ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.CreatedAt) 81 + ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.DID, &u.CreatedAt) 82 82 if err != nil { 83 83 return nil, err 84 84 } ··· 88 88 func (db *DB) GetUserByEmail(email string) (*model.User, error) { 89 89 u := &model.User{} 90 90 err := db.QueryRow( 91 - `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, created_at 91 + `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, did, created_at 92 92 FROM users WHERE email = ?`, email, 93 - ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.CreatedAt) 93 + ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.DID, &u.CreatedAt) 94 94 if err != nil { 95 95 return nil, err 96 96 } ··· 100 100 func (db *DB) GetUserByOAuth(provider, oauthID string) (*model.User, error) { 101 101 u := &model.User{} 102 102 err := db.QueryRow( 103 - `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, created_at 103 + `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, did, created_at 104 104 FROM users WHERE oauth_provider = ? AND oauth_id = ?`, provider, oauthID, 105 - ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.CreatedAt) 105 + ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.DID, &u.CreatedAt) 106 + if err != nil { 107 + return nil, err 108 + } 109 + return u, nil 110 + } 111 + 112 + func (db *DB) GetUserByDID(did string) (*model.User, error) { 113 + u := &model.User{} 114 + err := db.QueryRow( 115 + `SELECT id, name, email, password_hash, avatar_url, oauth_provider, oauth_id, did, created_at 116 + FROM users WHERE did = ?`, did, 117 + ).Scan(&u.ID, &u.Name, &u.Email, &u.PasswordHash, &u.AvatarURL, &u.OAuthProvider, &u.OAuthID, &u.DID, &u.CreatedAt) 106 118 if err != nil { 107 119 return nil, err 108 120 }
+9 -8
internal/model/models.go
··· 3 3 import "time" 4 4 5 5 type User struct { 6 - ID string `json:"id"` 7 - Name string `json:"name"` 8 - Email string `json:"email"` 9 - PasswordHash *string `json:"-"` 10 - AvatarURL string `json:"avatar_url"` 11 - OAuthProvider *string `json:"oauth_provider,omitempty"` 12 - OAuthID *string `json:"-"` 13 - CreatedAt time.Time `json:"created_at"` 6 + ID string `json:"id"` 7 + Name string `json:"name"` 8 + Email string `json:"email"` 9 + PasswordHash *string `json:"-"` 10 + AvatarURL string `json:"avatar_url"` 11 + OAuthProvider *string `json:"oauth_provider,omitempty"` 12 + OAuthID *string `json:"-"` 13 + DID *string `json:"did,omitempty"` 14 + CreatedAt time.Time `json:"created_at"` 14 15 } 15 16 16 17 type Repo struct {