Alternative ATProto PDS implementation

prototype models

+857
+26
migrations/2025-05-15-182818_init_diff/down.sql
··· 1 + -- This file should undo anything in `up.sql` 2 + DROP TABLE IF EXISTS `oauth_refresh_tokens`; 3 + DROP TABLE IF EXISTS `repo_seq`; 4 + DROP TABLE IF EXISTS `blob`; 5 + DROP TABLE IF EXISTS `oauth_used_jtis`; 6 + DROP TABLE IF EXISTS `app_password`; 7 + DROP TABLE IF EXISTS `repo_block`; 8 + DROP TABLE IF EXISTS `device_account`; 9 + DROP TABLE IF EXISTS `backlink`; 10 + DROP TABLE IF EXISTS `actor`; 11 + DROP TABLE IF EXISTS `device`; 12 + DROP TABLE IF EXISTS `did_doc`; 13 + DROP TABLE IF EXISTS `email_token`; 14 + DROP TABLE IF EXISTS `invite_code`; 15 + DROP TABLE IF EXISTS `oauth_par_requests`; 16 + DROP TABLE IF EXISTS `record`; 17 + DROP TABLE IF EXISTS `repo_root`; 18 + DROP TABLE IF EXISTS `used_refresh_token`; 19 + DROP TABLE IF EXISTS `invite_code_use`; 20 + DROP TABLE IF EXISTS `oauth_authorization_codes`; 21 + DROP TABLE IF EXISTS `authorization_request`; 22 + DROP TABLE IF EXISTS `token`; 23 + DROP TABLE IF EXISTS `refresh_token`; 24 + DROP TABLE IF EXISTS `account_pref`; 25 + DROP TABLE IF EXISTS `record_blob`; 26 + DROP TABLE IF EXISTS `account`;
+230
migrations/2025-05-15-182818_init_diff/up.sql
··· 1 + CREATE TABLE `oauth_refresh_tokens`( 2 + `token` VARCHAR NOT NULL PRIMARY KEY, 3 + `client_id` VARCHAR NOT NULL, 4 + `subject` VARCHAR NOT NULL, 5 + `dpop_thumbprint` VARCHAR NOT NULL, 6 + `scope` VARCHAR, 7 + `created_at` INT8 NOT NULL, 8 + `expires_at` INT8 NOT NULL, 9 + `revoked` BOOL NOT NULL 10 + ); 11 + 12 + CREATE TABLE `repo_seq`( 13 + `seq` INT8 NOT NULL PRIMARY KEY, 14 + `did` VARCHAR NOT NULL, 15 + `eventtype` VARCHAR NOT NULL, 16 + `event` BYTEA NOT NULL, 17 + `invalidated` INT2 NOT NULL, 18 + `sequencedat` VARCHAR NOT NULL 19 + ); 20 + 21 + CREATE TABLE `blob`( 22 + `cid` VARCHAR NOT NULL, 23 + `did` VARCHAR NOT NULL, 24 + `mimetype` VARCHAR NOT NULL, 25 + `size` INT4 NOT NULL, 26 + `tempkey` VARCHAR, 27 + `width` INT4, 28 + `height` INT4, 29 + `createdat` VARCHAR NOT NULL, 30 + `takedownref` VARCHAR, 31 + PRIMARY KEY(`cid`, `did`) 32 + ); 33 + 34 + CREATE TABLE `oauth_used_jtis`( 35 + `jti` VARCHAR NOT NULL PRIMARY KEY, 36 + `issuer` VARCHAR NOT NULL, 37 + `created_at` INT8 NOT NULL, 38 + `expires_at` INT8 NOT NULL 39 + ); 40 + 41 + CREATE TABLE `app_password`( 42 + `did` VARCHAR NOT NULL, 43 + `name` VARCHAR NOT NULL, 44 + `password` VARCHAR NOT NULL, 45 + `createdat` VARCHAR NOT NULL, 46 + PRIMARY KEY(`did`, `name`) 47 + ); 48 + 49 + CREATE TABLE `repo_block`( 50 + `cid` VARCHAR NOT NULL, 51 + `did` VARCHAR NOT NULL, 52 + `reporev` VARCHAR NOT NULL, 53 + `size` INT4 NOT NULL, 54 + `content` BYTEA NOT NULL, 55 + PRIMARY KEY(`cid`, `did`) 56 + ); 57 + 58 + CREATE TABLE `device_account`( 59 + `did` VARCHAR NOT NULL, 60 + `deviceid` VARCHAR NOT NULL, 61 + `authenticatedat` TIMESTAMPTZ NOT NULL, 62 + `remember` BOOL NOT NULL, 63 + `authorizedclients` VARCHAR NOT NULL, 64 + PRIMARY KEY(`deviceId`, `did`) 65 + ); 66 + 67 + CREATE TABLE `backlink`( 68 + `uri` VARCHAR NOT NULL, 69 + `path` VARCHAR NOT NULL, 70 + `linkto` VARCHAR NOT NULL, 71 + PRIMARY KEY(`uri`, `path`) 72 + ); 73 + 74 + CREATE TABLE `actor`( 75 + `did` VARCHAR NOT NULL PRIMARY KEY, 76 + `handle` VARCHAR, 77 + `createdat` VARCHAR NOT NULL, 78 + `takedownref` VARCHAR, 79 + `deactivatedat` VARCHAR, 80 + `deleteafter` VARCHAR 81 + ); 82 + 83 + CREATE TABLE `device`( 84 + `id` VARCHAR NOT NULL PRIMARY KEY, 85 + `sessionid` VARCHAR, 86 + `useragent` VARCHAR, 87 + `ipaddress` VARCHAR NOT NULL, 88 + `lastseenat` TIMESTAMPTZ NOT NULL 89 + ); 90 + 91 + CREATE TABLE `did_doc`( 92 + `did` VARCHAR NOT NULL PRIMARY KEY, 93 + `doc` TEXT NOT NULL, 94 + `updatedat` INT8 NOT NULL 95 + ); 96 + 97 + CREATE TABLE `email_token`( 98 + `purpose` VARCHAR NOT NULL, 99 + `did` VARCHAR NOT NULL, 100 + `token` VARCHAR NOT NULL, 101 + `requestedat` VARCHAR NOT NULL, 102 + PRIMARY KEY(`purpose`, `did`) 103 + ); 104 + 105 + CREATE TABLE `invite_code`( 106 + `code` VARCHAR NOT NULL PRIMARY KEY, 107 + `availableuses` INT4 NOT NULL, 108 + `disabled` INT2 NOT NULL, 109 + `foraccount` VARCHAR NOT NULL, 110 + `createdby` VARCHAR NOT NULL, 111 + `createdat` VARCHAR NOT NULL 112 + ); 113 + 114 + CREATE TABLE `oauth_par_requests`( 115 + `request_uri` VARCHAR NOT NULL PRIMARY KEY, 116 + `client_id` VARCHAR NOT NULL, 117 + `response_type` VARCHAR NOT NULL, 118 + `code_challenge` VARCHAR NOT NULL, 119 + `code_challenge_method` VARCHAR NOT NULL, 120 + `state` VARCHAR, 121 + `login_hint` VARCHAR, 122 + `scope` VARCHAR, 123 + `redirect_uri` VARCHAR, 124 + `response_mode` VARCHAR, 125 + `display` VARCHAR, 126 + `created_at` INT8 NOT NULL, 127 + `expires_at` INT8 NOT NULL 128 + ); 129 + 130 + CREATE TABLE `record`( 131 + `uri` VARCHAR NOT NULL PRIMARY KEY, 132 + `cid` VARCHAR NOT NULL, 133 + `did` VARCHAR NOT NULL, 134 + `collection` VARCHAR NOT NULL, 135 + `rkey` VARCHAR NOT NULL, 136 + `reporev` VARCHAR, 137 + `indexedat` VARCHAR NOT NULL, 138 + `takedownref` VARCHAR 139 + ); 140 + 141 + CREATE TABLE `repo_root`( 142 + `did` VARCHAR NOT NULL PRIMARY KEY, 143 + `cid` VARCHAR NOT NULL, 144 + `rev` VARCHAR NOT NULL, 145 + `indexedat` VARCHAR NOT NULL 146 + ); 147 + 148 + CREATE TABLE `used_refresh_token`( 149 + `refreshtoken` VARCHAR NOT NULL PRIMARY KEY, 150 + `tokenid` VARCHAR NOT NULL 151 + ); 152 + 153 + CREATE TABLE `invite_code_use`( 154 + `code` VARCHAR NOT NULL, 155 + `usedby` VARCHAR NOT NULL, 156 + `usedat` VARCHAR NOT NULL, 157 + PRIMARY KEY(`code`, `usedBy`) 158 + ); 159 + 160 + CREATE TABLE `oauth_authorization_codes`( 161 + `code` VARCHAR NOT NULL PRIMARY KEY, 162 + `client_id` VARCHAR NOT NULL, 163 + `subject` VARCHAR NOT NULL, 164 + `code_challenge` VARCHAR NOT NULL, 165 + `code_challenge_method` VARCHAR NOT NULL, 166 + `redirect_uri` VARCHAR NOT NULL, 167 + `scope` VARCHAR, 168 + `created_at` INT8 NOT NULL, 169 + `expires_at` INT8 NOT NULL, 170 + `used` BOOL NOT NULL 171 + ); 172 + 173 + CREATE TABLE `authorization_request`( 174 + `id` VARCHAR NOT NULL PRIMARY KEY, 175 + `did` VARCHAR, 176 + `deviceid` VARCHAR, 177 + `clientid` VARCHAR NOT NULL, 178 + `clientauth` VARCHAR NOT NULL, 179 + `parameters` VARCHAR NOT NULL, 180 + `expiresat` TIMESTAMPTZ NOT NULL, 181 + `code` VARCHAR 182 + ); 183 + 184 + CREATE TABLE `token`( 185 + `id` VARCHAR NOT NULL PRIMARY KEY, 186 + `did` VARCHAR NOT NULL, 187 + `tokenid` VARCHAR NOT NULL, 188 + `createdat` TIMESTAMPTZ NOT NULL, 189 + `updatedat` TIMESTAMPTZ NOT NULL, 190 + `expiresat` TIMESTAMPTZ NOT NULL, 191 + `clientid` VARCHAR NOT NULL, 192 + `clientauth` VARCHAR NOT NULL, 193 + `deviceid` VARCHAR, 194 + `parameters` VARCHAR NOT NULL, 195 + `details` VARCHAR, 196 + `code` VARCHAR, 197 + `currentrefreshtoken` VARCHAR 198 + ); 199 + 200 + CREATE TABLE `refresh_token`( 201 + `id` VARCHAR NOT NULL PRIMARY KEY, 202 + `did` VARCHAR NOT NULL, 203 + `expiresat` VARCHAR NOT NULL, 204 + `nextid` VARCHAR, 205 + `apppasswordname` VARCHAR 206 + ); 207 + 208 + CREATE TABLE `account_pref`( 209 + `id` INT4 NOT NULL PRIMARY KEY, 210 + `did` VARCHAR NOT NULL, 211 + `name` VARCHAR NOT NULL, 212 + `valuejson` TEXT 213 + ); 214 + 215 + CREATE TABLE `record_blob`( 216 + `blobcid` VARCHAR NOT NULL, 217 + `recorduri` VARCHAR NOT NULL, 218 + `did` VARCHAR NOT NULL, 219 + PRIMARY KEY(`blobCid`, `recordUri`) 220 + ); 221 + 222 + CREATE TABLE `account`( 223 + `did` VARCHAR NOT NULL PRIMARY KEY, 224 + `email` VARCHAR NOT NULL, 225 + `recoverykey` VARCHAR, 226 + `password` VARCHAR NOT NULL, 227 + `createdat` VARCHAR NOT NULL, 228 + `invitesdisabled` INT2 NOT NULL, 229 + `emailconfirmedat` VARCHAR 230 + );
+601
src/models.rs
··· 1 + // Generated by diesel_ext 2 + 3 + #![allow(unused, non_snake_case)] 4 + #![allow(clippy::all)] 5 + 6 + pub mod pds { 7 + 8 + use anyhow::{Result, bail}; 9 + use chrono::DateTime; 10 + use chrono::offset::Utc; 11 + use diesel::backend::Backend; 12 + use diesel::deserialize::FromSql; 13 + use diesel::prelude::*; 14 + use diesel::serialize::{Output, ToSql}; 15 + use diesel::sql_types::Text; 16 + use diesel::sqlite::Sqlite; 17 + use diesel::*; 18 + use serde::{Deserialize, Serialize}; 19 + 20 + #[derive( 21 + Queryable, 22 + Identifiable, 23 + Selectable, 24 + Clone, 25 + Debug, 26 + PartialEq, 27 + Default, 28 + Serialize, 29 + Deserialize, 30 + )] 31 + #[diesel(primary_key(request_uri))] 32 + #[diesel(table_name = crate::schema::pds::oauth_par_requests)] 33 + #[diesel(check_for_backend(Sqlite))] 34 + pub struct OauthParRequest { 35 + pub request_uri: String, 36 + pub client_id: String, 37 + pub response_type: String, 38 + pub code_challenge: String, 39 + pub code_challenge_method: String, 40 + pub state: Option<String>, 41 + pub login_hint: Option<String>, 42 + pub scope: Option<String>, 43 + pub redirect_uri: Option<String>, 44 + pub response_mode: Option<String>, 45 + pub display: Option<String>, 46 + pub created_at: i64, 47 + pub expires_at: i64, 48 + } 49 + 50 + #[derive( 51 + Queryable, 52 + Identifiable, 53 + Selectable, 54 + Clone, 55 + Debug, 56 + PartialEq, 57 + Default, 58 + Serialize, 59 + Deserialize, 60 + )] 61 + #[diesel(primary_key(code))] 62 + #[diesel(table_name = crate::schema::pds::oauth_authorization_codes)] 63 + #[diesel(check_for_backend(Sqlite))] 64 + pub struct OauthAuthorizationCode { 65 + pub code: String, 66 + pub client_id: String, 67 + pub subject: String, 68 + pub code_challenge: String, 69 + pub code_challenge_method: String, 70 + pub redirect_uri: String, 71 + pub scope: Option<String>, 72 + pub created_at: i64, 73 + pub expires_at: i64, 74 + pub used: bool, 75 + } 76 + 77 + #[derive( 78 + Queryable, 79 + Identifiable, 80 + Selectable, 81 + Clone, 82 + Debug, 83 + PartialEq, 84 + Default, 85 + Serialize, 86 + Deserialize, 87 + )] 88 + #[diesel(primary_key(token))] 89 + #[diesel(table_name = crate::schema::pds::oauth_refresh_tokens)] 90 + #[diesel(check_for_backend(Sqlite))] 91 + pub struct OauthRefreshToken { 92 + pub token: String, 93 + pub client_id: String, 94 + pub subject: String, 95 + pub dpop_thumbprint: String, 96 + pub scope: Option<String>, 97 + pub created_at: i64, 98 + pub expires_at: i64, 99 + pub revoked: bool, 100 + } 101 + 102 + #[derive( 103 + Queryable, 104 + Identifiable, 105 + Selectable, 106 + Clone, 107 + Debug, 108 + PartialEq, 109 + Default, 110 + Serialize, 111 + Deserialize, 112 + )] 113 + #[diesel(primary_key(jti))] 114 + #[diesel(table_name = crate::schema::pds::oauth_used_jtis)] 115 + #[diesel(check_for_backend(Sqlite))] 116 + pub struct OauthUsedJti { 117 + pub jti: String, 118 + pub issuer: String, 119 + pub created_at: i64, 120 + pub expires_at: i64, 121 + } 122 + 123 + #[derive( 124 + Queryable, 125 + Identifiable, 126 + Selectable, 127 + Clone, 128 + Debug, 129 + PartialEq, 130 + Default, 131 + Serialize, 132 + Deserialize, 133 + )] 134 + #[diesel(primary_key(did))] 135 + #[diesel(table_name = crate::schema::pds::account)] 136 + #[diesel(check_for_backend(Sqlite))] 137 + pub struct Account { 138 + pub did: String, 139 + pub email: String, 140 + #[diesel(column_name = recoveryKey)] 141 + #[serde(rename = "recoveryKey")] 142 + pub recovery_key: Option<String>, 143 + pub password: String, 144 + #[diesel(column_name = createdAt)] 145 + #[serde(rename = "createdAt")] 146 + pub created_at: String, 147 + #[diesel(column_name = invitesDisabled)] 148 + #[serde(rename = "invitesDisabled")] 149 + pub invites_disabled: i16, 150 + #[diesel(column_name = emailConfirmedAt)] 151 + #[serde(rename = "emailConfirmedAt")] 152 + pub email_confirmed_at: Option<String>, 153 + } 154 + 155 + #[derive( 156 + Queryable, 157 + Identifiable, 158 + Selectable, 159 + Clone, 160 + Debug, 161 + PartialEq, 162 + Default, 163 + Serialize, 164 + Deserialize, 165 + )] 166 + #[diesel(table_name = crate::schema::pds::account_pref)] 167 + #[diesel(check_for_backend(Sqlite))] 168 + pub struct AccountPref { 169 + pub id: i32, 170 + pub did: String, 171 + pub name: String, 172 + pub valueJson: Option<String>, 173 + } 174 + 175 + #[derive( 176 + Queryable, 177 + Identifiable, 178 + Selectable, 179 + Clone, 180 + Debug, 181 + PartialEq, 182 + Default, 183 + Serialize, 184 + Deserialize, 185 + )] 186 + #[diesel(primary_key(did))] 187 + #[diesel(table_name = crate::schema::pds::actor)] 188 + #[diesel(check_for_backend(Sqlite))] 189 + pub struct Actor { 190 + pub did: String, 191 + pub handle: Option<String>, 192 + pub createdAt: String, 193 + pub takedownRef: Option<String>, 194 + pub deactivatedAt: Option<String>, 195 + pub deleteAfter: Option<String>, 196 + } 197 + 198 + #[derive( 199 + Queryable, 200 + Identifiable, 201 + Selectable, 202 + Clone, 203 + Debug, 204 + PartialEq, 205 + Default, 206 + Serialize, 207 + Deserialize, 208 + )] 209 + #[diesel(primary_key(did, name))] 210 + #[diesel(table_name = crate::schema::pds::app_password)] 211 + #[diesel(check_for_backend(Sqlite))] 212 + pub struct AppPassword { 213 + pub did: String, 214 + pub name: String, 215 + pub password: String, 216 + pub createdAt: String, 217 + } 218 + 219 + #[derive( 220 + Queryable, 221 + Identifiable, 222 + Selectable, 223 + Clone, 224 + Debug, 225 + PartialEq, 226 + Default, 227 + Serialize, 228 + Deserialize, 229 + )] 230 + #[diesel(table_name = crate::schema::pds::authorization_request)] 231 + #[diesel(check_for_backend(Sqlite))] 232 + pub struct AuthorizationRequest { 233 + pub id: String, 234 + pub did: Option<String>, 235 + pub deviceId: Option<String>, 236 + pub clientId: String, 237 + pub clientAuth: String, 238 + pub parameters: String, 239 + pub expiresAt: DateTime<Utc>, 240 + pub code: Option<String>, 241 + } 242 + 243 + #[derive( 244 + Queryable, 245 + Identifiable, 246 + Selectable, 247 + Clone, 248 + Debug, 249 + PartialEq, 250 + Default, 251 + Serialize, 252 + Deserialize, 253 + )] 254 + #[diesel(primary_key(uri, path))] 255 + #[diesel(table_name = crate::schema::pds::backlink)] 256 + #[diesel(check_for_backend(Sqlite))] 257 + pub struct Backlink { 258 + pub uri: String, 259 + pub path: String, 260 + pub linkTo: String, 261 + } 262 + 263 + #[derive( 264 + Queryable, 265 + Identifiable, 266 + Selectable, 267 + Clone, 268 + Debug, 269 + PartialEq, 270 + Default, 271 + Serialize, 272 + Deserialize, 273 + )] 274 + #[diesel(primary_key(cid, did))] 275 + #[diesel(table_name = crate::schema::pds::blob)] 276 + #[diesel(check_for_backend(Sqlite))] 277 + pub struct Blob { 278 + pub cid: String, 279 + pub did: String, 280 + pub mimeType: String, 281 + pub size: i32, 282 + pub tempKey: Option<String>, 283 + pub width: Option<i32>, 284 + pub height: Option<i32>, 285 + pub createdAt: String, 286 + pub takedownRef: Option<String>, 287 + } 288 + 289 + #[derive( 290 + Queryable, 291 + Identifiable, 292 + Selectable, 293 + Clone, 294 + Debug, 295 + PartialEq, 296 + Default, 297 + Serialize, 298 + Deserialize, 299 + )] 300 + #[diesel(table_name = crate::schema::pds::device)] 301 + #[diesel(check_for_backend(Sqlite))] 302 + pub struct Device { 303 + pub id: String, 304 + pub sessionId: Option<String>, 305 + pub userAgent: Option<String>, 306 + pub ipAddress: String, 307 + pub lastSeenAt: DateTime<Utc>, 308 + } 309 + 310 + #[derive( 311 + Queryable, 312 + Identifiable, 313 + Selectable, 314 + Clone, 315 + Debug, 316 + PartialEq, 317 + Default, 318 + Serialize, 319 + Deserialize, 320 + )] 321 + #[diesel(primary_key(deviceId, did))] 322 + #[diesel(table_name = crate::schema::pds::device_account)] 323 + #[diesel(check_for_backend(Sqlite))] 324 + pub struct DeviceAccount { 325 + pub did: String, 326 + pub deviceId: String, 327 + pub authenticatedAt: DateTime<Utc>, 328 + pub remember: bool, 329 + pub authorizedClients: String, 330 + } 331 + 332 + #[derive( 333 + Queryable, 334 + Identifiable, 335 + Selectable, 336 + Clone, 337 + Debug, 338 + PartialEq, 339 + Default, 340 + Serialize, 341 + Deserialize, 342 + )] 343 + #[diesel(primary_key(did))] 344 + #[diesel(table_name = crate::schema::pds::did_doc)] 345 + #[diesel(check_for_backend(Sqlite))] 346 + pub struct DidDoc { 347 + pub did: String, 348 + pub doc: String, 349 + pub updatedAt: i64, 350 + } 351 + 352 + #[derive( 353 + Queryable, 354 + Identifiable, 355 + Selectable, 356 + Clone, 357 + Debug, 358 + PartialEq, 359 + Default, 360 + Serialize, 361 + Deserialize, 362 + )] 363 + #[diesel(primary_key(purpose, did))] 364 + #[diesel(table_name = crate::schema::pds::email_token)] 365 + #[diesel(check_for_backend(Sqlite))] 366 + pub struct EmailToken { 367 + pub purpose: String, 368 + pub did: String, 369 + pub token: String, 370 + pub requestedAt: String, 371 + } 372 + 373 + #[derive( 374 + Queryable, 375 + Identifiable, 376 + Selectable, 377 + Clone, 378 + Debug, 379 + PartialEq, 380 + Default, 381 + Serialize, 382 + Deserialize, 383 + )] 384 + #[diesel(primary_key(code))] 385 + #[diesel(table_name = crate::schema::pds::invite_code)] 386 + #[diesel(check_for_backend(Sqlite))] 387 + pub struct InviteCode { 388 + pub code: String, 389 + pub availableUses: i32, 390 + pub disabled: i16, 391 + pub forAccount: String, 392 + pub createdBy: String, 393 + pub createdAt: String, 394 + } 395 + 396 + #[derive( 397 + Queryable, 398 + Identifiable, 399 + Selectable, 400 + Clone, 401 + Debug, 402 + PartialEq, 403 + Default, 404 + Serialize, 405 + Deserialize, 406 + )] 407 + #[diesel(primary_key(code, usedBy))] 408 + #[diesel(table_name = crate::schema::pds::invite_code_use)] 409 + #[diesel(check_for_backend(Sqlite))] 410 + pub struct InviteCodeUse { 411 + pub code: String, 412 + pub usedBy: String, 413 + pub usedAt: String, 414 + } 415 + 416 + #[derive( 417 + Queryable, 418 + Identifiable, 419 + Selectable, 420 + Clone, 421 + Debug, 422 + PartialEq, 423 + Default, 424 + Serialize, 425 + Deserialize, 426 + )] 427 + #[diesel(primary_key(uri))] 428 + #[diesel(table_name = crate::schema::pds::record)] 429 + #[diesel(check_for_backend(Sqlite))] 430 + pub struct Record { 431 + pub uri: String, 432 + pub cid: String, 433 + pub did: String, 434 + pub collection: String, 435 + pub rkey: String, 436 + pub repoRev: Option<String>, 437 + pub indexedAt: String, 438 + pub takedownRef: Option<String>, 439 + } 440 + 441 + #[derive( 442 + Queryable, 443 + Identifiable, 444 + Selectable, 445 + Clone, 446 + Debug, 447 + PartialEq, 448 + Default, 449 + Serialize, 450 + Deserialize, 451 + )] 452 + #[diesel(primary_key(blobCid, recordUri))] 453 + #[diesel(table_name = crate::schema::pds::record_blob)] 454 + #[diesel(check_for_backend(Sqlite))] 455 + pub struct RecordBlob { 456 + pub blobCid: String, 457 + pub recordUri: String, 458 + pub did: String, 459 + } 460 + 461 + #[derive( 462 + Queryable, 463 + Identifiable, 464 + Selectable, 465 + Clone, 466 + Debug, 467 + PartialEq, 468 + Default, 469 + Serialize, 470 + Deserialize, 471 + )] 472 + #[diesel(table_name = crate::schema::pds::refresh_token)] 473 + #[diesel(check_for_backend(Sqlite))] 474 + pub struct RefreshToken { 475 + pub id: String, 476 + pub did: String, 477 + #[diesel(column_name = expiresAt)] 478 + #[serde(rename = "expiresAt")] 479 + pub expires_at: String, 480 + #[diesel(column_name = nextId)] 481 + #[serde(rename = "nextId")] 482 + pub next_id: Option<String>, 483 + #[diesel(column_name = appPasswordName)] 484 + #[serde(rename = "appPasswordName")] 485 + pub app_password_name: Option<String>, 486 + } 487 + 488 + #[derive( 489 + Queryable, 490 + Identifiable, 491 + Selectable, 492 + Clone, 493 + Debug, 494 + PartialEq, 495 + Default, 496 + Serialize, 497 + Deserialize, 498 + )] 499 + #[diesel(primary_key(cid, did))] 500 + #[diesel(table_name = crate::schema::pds::repo_block)] 501 + #[diesel(check_for_backend(Sqlite))] 502 + pub struct RepoBlock { 503 + pub cid: String, 504 + pub did: String, 505 + pub repoRev: String, 506 + pub size: i32, 507 + pub content: Vec<u8>, 508 + } 509 + 510 + #[derive( 511 + Queryable, 512 + Identifiable, 513 + Selectable, 514 + Clone, 515 + Debug, 516 + PartialEq, 517 + Default, 518 + Serialize, 519 + Deserialize, 520 + )] 521 + #[diesel(primary_key(did))] 522 + #[diesel(table_name = crate::schema::pds::repo_root)] 523 + #[diesel(check_for_backend(Sqlite))] 524 + pub struct RepoRoot { 525 + pub did: String, 526 + pub cid: String, 527 + pub rev: String, 528 + pub indexedAt: String, 529 + } 530 + 531 + #[derive( 532 + Queryable, 533 + Identifiable, 534 + Selectable, 535 + Clone, 536 + Debug, 537 + PartialEq, 538 + Default, 539 + Serialize, 540 + Deserialize, 541 + )] 542 + #[diesel(primary_key(seq))] 543 + #[diesel(table_name = crate::schema::pds::repo_seq)] 544 + #[diesel(check_for_backend(Sqlite))] 545 + pub struct RepoSeq { 546 + pub seq: i64, 547 + pub did: String, 548 + pub eventType: String, 549 + pub event: Vec<u8>, 550 + pub invalidated: i16, 551 + pub sequencedAt: String, 552 + } 553 + 554 + #[derive( 555 + Queryable, 556 + Identifiable, 557 + Selectable, 558 + Clone, 559 + Debug, 560 + PartialEq, 561 + Default, 562 + Serialize, 563 + Deserialize, 564 + )] 565 + #[diesel(table_name = crate::schema::pds::token)] 566 + #[diesel(check_for_backend(Sqlite))] 567 + pub struct Token { 568 + pub id: String, 569 + pub did: String, 570 + pub tokenId: String, 571 + pub createdAt: DateTime<Utc>, 572 + pub updatedAt: DateTime<Utc>, 573 + pub expiresAt: DateTime<Utc>, 574 + pub clientId: String, 575 + pub clientAuth: String, 576 + pub deviceId: Option<String>, 577 + pub parameters: String, 578 + pub details: Option<String>, 579 + pub code: Option<String>, 580 + pub currentRefreshToken: Option<String>, 581 + } 582 + 583 + #[derive( 584 + Queryable, 585 + Identifiable, 586 + Selectable, 587 + Clone, 588 + Debug, 589 + PartialEq, 590 + Default, 591 + Serialize, 592 + Deserialize, 593 + )] 594 + #[diesel(primary_key(refreshToken))] 595 + #[diesel(table_name = crate::schema::pds::used_refresh_token)] 596 + #[diesel(check_for_backend(Sqlite))] 597 + pub struct UsedRefreshToken { 598 + pub refreshToken: String, 599 + pub tokenId: String, 600 + } 601 + }