lib.rs (26268B)
1 use radroots_replica_schema::ReplicaSchemaError; 2 pub use radroots_sql_core::error::SqlError; 3 pub use radroots_sql_core::{ExecOutcome, SqlExecutor}; 4 5 use radroots_replica_schema::farm::{ 6 IFarmCreate, IFarmCreateResolve, IFarmDelete, IFarmDeleteResolve, IFarmFindMany, 7 IFarmFindManyResolve, IFarmFindOne, IFarmFindOneResolve, IFarmUpdate, IFarmUpdateResolve, 8 }; 9 10 use radroots_replica_schema::farm_gcs_location::{ 11 IFarmGcsLocationCreate, IFarmGcsLocationCreateResolve, IFarmGcsLocationDelete, 12 IFarmGcsLocationDeleteResolve, IFarmGcsLocationFindMany, IFarmGcsLocationFindManyResolve, 13 IFarmGcsLocationFindOne, IFarmGcsLocationFindOneResolve, IFarmGcsLocationUpdate, 14 IFarmGcsLocationUpdateResolve, 15 }; 16 17 use radroots_replica_schema::farm_member::{ 18 IFarmMemberCreate, IFarmMemberCreateResolve, IFarmMemberDelete, IFarmMemberDeleteResolve, 19 IFarmMemberFindMany, IFarmMemberFindManyResolve, IFarmMemberFindOne, IFarmMemberFindOneResolve, 20 IFarmMemberUpdate, IFarmMemberUpdateResolve, 21 }; 22 23 use radroots_replica_schema::farm_member_claim::{ 24 IFarmMemberClaimCreate, IFarmMemberClaimCreateResolve, IFarmMemberClaimDelete, 25 IFarmMemberClaimDeleteResolve, IFarmMemberClaimFindMany, IFarmMemberClaimFindManyResolve, 26 IFarmMemberClaimFindOne, IFarmMemberClaimFindOneResolve, IFarmMemberClaimUpdate, 27 IFarmMemberClaimUpdateResolve, 28 }; 29 30 use radroots_replica_schema::farm_tag::{ 31 IFarmTagCreate, IFarmTagCreateResolve, IFarmTagDelete, IFarmTagDeleteResolve, IFarmTagFindMany, 32 IFarmTagFindManyResolve, IFarmTagFindOne, IFarmTagFindOneResolve, IFarmTagUpdate, 33 IFarmTagUpdateResolve, 34 }; 35 36 use radroots_replica_schema::gcs_location::{ 37 IGcsLocationCreate, IGcsLocationCreateResolve, IGcsLocationDelete, IGcsLocationDeleteResolve, 38 IGcsLocationFindMany, IGcsLocationFindManyResolve, IGcsLocationFindOne, 39 IGcsLocationFindOneResolve, IGcsLocationUpdate, IGcsLocationUpdateResolve, 40 }; 41 42 use radroots_replica_schema::log_error::{ 43 ILogErrorCreate, ILogErrorCreateResolve, ILogErrorDelete, ILogErrorDeleteResolve, 44 ILogErrorFindMany, ILogErrorFindManyResolve, ILogErrorFindOne, ILogErrorFindOneResolve, 45 ILogErrorUpdate, ILogErrorUpdateResolve, 46 }; 47 48 use radroots_replica_schema::media_image::{ 49 IMediaImageCreate, IMediaImageCreateResolve, IMediaImageDelete, IMediaImageDeleteResolve, 50 IMediaImageFindMany, IMediaImageFindManyResolve, IMediaImageFindOne, IMediaImageFindOneResolve, 51 IMediaImageUpdate, IMediaImageUpdateResolve, 52 }; 53 54 use radroots_replica_schema::nostr_profile::{ 55 INostrProfileCreate, INostrProfileCreateResolve, INostrProfileDelete, 56 INostrProfileDeleteResolve, INostrProfileFindMany, INostrProfileFindManyResolve, 57 INostrProfileFindOne, INostrProfileFindOneResolve, INostrProfileUpdate, 58 INostrProfileUpdateResolve, 59 }; 60 61 use radroots_replica_schema::nostr_event_head::{ 62 INostrEventHeadCreate, INostrEventHeadCreateResolve, INostrEventHeadDelete, 63 INostrEventHeadDeleteResolve, INostrEventHeadFindMany, INostrEventHeadFindManyResolve, 64 INostrEventHeadFindOne, INostrEventHeadFindOneResolve, INostrEventHeadUpdate, 65 INostrEventHeadUpdateResolve, 66 }; 67 68 use radroots_replica_schema::nostr_relay::{ 69 INostrRelayCreate, INostrRelayCreateResolve, INostrRelayDelete, INostrRelayDeleteResolve, 70 INostrRelayFindMany, INostrRelayFindManyResolve, INostrRelayFindOne, INostrRelayFindOneResolve, 71 INostrRelayUpdate, INostrRelayUpdateResolve, 72 }; 73 74 use radroots_replica_schema::trade_product::{ 75 ITradeProductCreate, ITradeProductCreateResolve, ITradeProductDelete, 76 ITradeProductDeleteResolve, ITradeProductFindMany, ITradeProductFindManyResolve, 77 ITradeProductFindOne, ITradeProductFindOneResolve, ITradeProductUpdate, 78 ITradeProductUpdateResolve, 79 }; 80 81 use radroots_replica_schema::plot::{ 82 IPlotCreate, IPlotCreateResolve, IPlotDelete, IPlotDeleteResolve, IPlotFindMany, 83 IPlotFindManyResolve, IPlotFindOne, IPlotFindOneResolve, IPlotUpdate, IPlotUpdateResolve, 84 }; 85 86 use radroots_replica_schema::plot_gcs_location::{ 87 IPlotGcsLocationCreate, IPlotGcsLocationCreateResolve, IPlotGcsLocationDelete, 88 IPlotGcsLocationDeleteResolve, IPlotGcsLocationFindMany, IPlotGcsLocationFindManyResolve, 89 IPlotGcsLocationFindOne, IPlotGcsLocationFindOneResolve, IPlotGcsLocationUpdate, 90 IPlotGcsLocationUpdateResolve, 91 }; 92 93 use radroots_replica_schema::plot_tag::{ 94 IPlotTagCreate, IPlotTagCreateResolve, IPlotTagDelete, IPlotTagDeleteResolve, IPlotTagFindMany, 95 IPlotTagFindManyResolve, IPlotTagFindOne, IPlotTagFindOneResolve, IPlotTagUpdate, 96 IPlotTagUpdateResolve, 97 }; 98 99 use radroots_replica_schema::nostr_profile_relay::{ 100 INostrProfileRelayRelation, INostrProfileRelayResolve, 101 }; 102 103 use radroots_replica_schema::trade_product_location::{ 104 ITradeProductLocationRelation, ITradeProductLocationResolve, 105 }; 106 107 use radroots_replica_schema::trade_product_media::{ 108 ITradeProductMediaRelation, ITradeProductMediaResolve, 109 }; 110 111 pub mod backup; 112 pub mod export; 113 pub mod migrations; 114 pub mod models; 115 pub mod query; 116 pub use backup::{DatabaseBackup, MigrationBackup, SchemaEntry}; 117 pub use export::{ 118 REPLICA_STORE_EXPORT_VERSION, ReplicaStoreExportManifestRs, TableCount, export_manifest, 119 }; 120 pub use models::*; 121 pub use query::ReplicaTradeProductSummaryRow; 122 123 pub struct ReplicaSql<E: SqlExecutor> { 124 executor: E, 125 } 126 127 impl<E: SqlExecutor> ReplicaSql<E> { 128 pub fn coverage_branch_probe(enabled: bool) -> &'static str { 129 if enabled { "enabled" } else { "disabled" } 130 } 131 } 132 133 impl<E: SqlExecutor> ReplicaSql<E> { 134 pub fn new(executor: E) -> Self { 135 Self { executor } 136 } 137 138 pub fn executor(&self) -> &E { 139 &self.executor 140 } 141 142 pub fn migrate_up(&self) -> Result<(), SqlError> { 143 crate::migrations::run_all_up(self.executor()) 144 } 145 146 pub fn migrate_down(&self) -> Result<(), SqlError> { 147 crate::migrations::run_all_down(self.executor()) 148 } 149 150 pub fn backup_database(&self) -> Result<DatabaseBackup, SqlError> { 151 crate::backup::export_database_backup(self.executor()) 152 } 153 154 pub fn backup_database_json(&self) -> Result<String, SqlError> { 155 crate::backup::export_database_backup_json(self.executor()) 156 } 157 158 pub fn restore_database(&self, backup: &DatabaseBackup) -> Result<(), SqlError> { 159 crate::backup::restore_database_backup(self.executor(), backup) 160 } 161 162 pub fn restore_database_json(&self, backup_json: &str) -> Result<(), SqlError> { 163 crate::backup::restore_database_backup_json(self.executor(), backup_json) 164 } 165 166 pub fn farm_create( 167 &self, 168 opts: &IFarmCreate, 169 ) -> Result<IFarmCreateResolve, ReplicaSchemaError<SqlError>> { 170 models::farm::create(self.executor(), opts) 171 } 172 173 pub fn farm_find_many( 174 &self, 175 opts: &IFarmFindMany, 176 ) -> Result<IFarmFindManyResolve, ReplicaSchemaError<SqlError>> { 177 models::farm::find_many(self.executor(), opts) 178 } 179 180 pub fn farm_find_one( 181 &self, 182 opts: &IFarmFindOne, 183 ) -> Result<IFarmFindOneResolve, ReplicaSchemaError<SqlError>> { 184 models::farm::find_one(self.executor(), opts) 185 } 186 187 pub fn farm_update( 188 &self, 189 opts: &IFarmUpdate, 190 ) -> Result<IFarmUpdateResolve, ReplicaSchemaError<SqlError>> { 191 models::farm::update(self.executor(), opts) 192 } 193 194 pub fn farm_delete( 195 &self, 196 opts: &IFarmDelete, 197 ) -> Result<IFarmDeleteResolve, ReplicaSchemaError<SqlError>> { 198 models::farm::delete(self.executor(), opts) 199 } 200 201 pub fn plot_create( 202 &self, 203 opts: &IPlotCreate, 204 ) -> Result<IPlotCreateResolve, ReplicaSchemaError<SqlError>> { 205 models::plot::create(self.executor(), opts) 206 } 207 208 pub fn plot_find_many( 209 &self, 210 opts: &IPlotFindMany, 211 ) -> Result<IPlotFindManyResolve, ReplicaSchemaError<SqlError>> { 212 models::plot::find_many(self.executor(), opts) 213 } 214 215 pub fn plot_find_one( 216 &self, 217 opts: &IPlotFindOne, 218 ) -> Result<IPlotFindOneResolve, ReplicaSchemaError<SqlError>> { 219 models::plot::find_one(self.executor(), opts) 220 } 221 222 pub fn plot_update( 223 &self, 224 opts: &IPlotUpdate, 225 ) -> Result<IPlotUpdateResolve, ReplicaSchemaError<SqlError>> { 226 models::plot::update(self.executor(), opts) 227 } 228 229 pub fn plot_delete( 230 &self, 231 opts: &IPlotDelete, 232 ) -> Result<IPlotDeleteResolve, ReplicaSchemaError<SqlError>> { 233 models::plot::delete(self.executor(), opts) 234 } 235 236 pub fn gcs_location_create( 237 &self, 238 opts: &IGcsLocationCreate, 239 ) -> Result<IGcsLocationCreateResolve, ReplicaSchemaError<SqlError>> { 240 models::gcs_location::create(self.executor(), opts) 241 } 242 243 pub fn gcs_location_find_many( 244 &self, 245 opts: &IGcsLocationFindMany, 246 ) -> Result<IGcsLocationFindManyResolve, ReplicaSchemaError<SqlError>> { 247 models::gcs_location::find_many(self.executor(), opts) 248 } 249 250 pub fn gcs_location_find_one( 251 &self, 252 opts: &IGcsLocationFindOne, 253 ) -> Result<IGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> { 254 models::gcs_location::find_one(self.executor(), opts) 255 } 256 257 pub fn gcs_location_update( 258 &self, 259 opts: &IGcsLocationUpdate, 260 ) -> Result<IGcsLocationUpdateResolve, ReplicaSchemaError<SqlError>> { 261 models::gcs_location::update(self.executor(), opts) 262 } 263 264 pub fn gcs_location_delete( 265 &self, 266 opts: &IGcsLocationDelete, 267 ) -> Result<IGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> { 268 models::gcs_location::delete(self.executor(), opts) 269 } 270 271 pub fn farm_gcs_location_create( 272 &self, 273 opts: &IFarmGcsLocationCreate, 274 ) -> Result<IFarmGcsLocationCreateResolve, ReplicaSchemaError<SqlError>> { 275 models::farm_gcs_location::create(self.executor(), opts) 276 } 277 278 pub fn farm_gcs_location_find_many( 279 &self, 280 opts: &IFarmGcsLocationFindMany, 281 ) -> Result<IFarmGcsLocationFindManyResolve, ReplicaSchemaError<SqlError>> { 282 models::farm_gcs_location::find_many(self.executor(), opts) 283 } 284 285 pub fn farm_gcs_location_find_one( 286 &self, 287 opts: &IFarmGcsLocationFindOne, 288 ) -> Result<IFarmGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> { 289 models::farm_gcs_location::find_one(self.executor(), opts) 290 } 291 292 pub fn farm_gcs_location_update( 293 &self, 294 opts: &IFarmGcsLocationUpdate, 295 ) -> Result<IFarmGcsLocationUpdateResolve, ReplicaSchemaError<SqlError>> { 296 models::farm_gcs_location::update(self.executor(), opts) 297 } 298 299 pub fn farm_gcs_location_delete( 300 &self, 301 opts: &IFarmGcsLocationDelete, 302 ) -> Result<IFarmGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> { 303 models::farm_gcs_location::delete(self.executor(), opts) 304 } 305 306 pub fn plot_gcs_location_create( 307 &self, 308 opts: &IPlotGcsLocationCreate, 309 ) -> Result<IPlotGcsLocationCreateResolve, ReplicaSchemaError<SqlError>> { 310 models::plot_gcs_location::create(self.executor(), opts) 311 } 312 313 pub fn plot_gcs_location_find_many( 314 &self, 315 opts: &IPlotGcsLocationFindMany, 316 ) -> Result<IPlotGcsLocationFindManyResolve, ReplicaSchemaError<SqlError>> { 317 models::plot_gcs_location::find_many(self.executor(), opts) 318 } 319 320 pub fn plot_gcs_location_find_one( 321 &self, 322 opts: &IPlotGcsLocationFindOne, 323 ) -> Result<IPlotGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> { 324 models::plot_gcs_location::find_one(self.executor(), opts) 325 } 326 327 pub fn plot_gcs_location_update( 328 &self, 329 opts: &IPlotGcsLocationUpdate, 330 ) -> Result<IPlotGcsLocationUpdateResolve, ReplicaSchemaError<SqlError>> { 331 models::plot_gcs_location::update(self.executor(), opts) 332 } 333 334 pub fn plot_gcs_location_delete( 335 &self, 336 opts: &IPlotGcsLocationDelete, 337 ) -> Result<IPlotGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> { 338 models::plot_gcs_location::delete(self.executor(), opts) 339 } 340 341 pub fn farm_tag_create( 342 &self, 343 opts: &IFarmTagCreate, 344 ) -> Result<IFarmTagCreateResolve, ReplicaSchemaError<SqlError>> { 345 models::farm_tag::create(self.executor(), opts) 346 } 347 348 pub fn farm_tag_find_many( 349 &self, 350 opts: &IFarmTagFindMany, 351 ) -> Result<IFarmTagFindManyResolve, ReplicaSchemaError<SqlError>> { 352 models::farm_tag::find_many(self.executor(), opts) 353 } 354 355 pub fn farm_tag_find_one( 356 &self, 357 opts: &IFarmTagFindOne, 358 ) -> Result<IFarmTagFindOneResolve, ReplicaSchemaError<SqlError>> { 359 models::farm_tag::find_one(self.executor(), opts) 360 } 361 362 pub fn farm_tag_update( 363 &self, 364 opts: &IFarmTagUpdate, 365 ) -> Result<IFarmTagUpdateResolve, ReplicaSchemaError<SqlError>> { 366 models::farm_tag::update(self.executor(), opts) 367 } 368 369 pub fn farm_tag_delete( 370 &self, 371 opts: &IFarmTagDelete, 372 ) -> Result<IFarmTagDeleteResolve, ReplicaSchemaError<SqlError>> { 373 models::farm_tag::delete(self.executor(), opts) 374 } 375 376 pub fn plot_tag_create( 377 &self, 378 opts: &IPlotTagCreate, 379 ) -> Result<IPlotTagCreateResolve, ReplicaSchemaError<SqlError>> { 380 models::plot_tag::create(self.executor(), opts) 381 } 382 383 pub fn plot_tag_find_many( 384 &self, 385 opts: &IPlotTagFindMany, 386 ) -> Result<IPlotTagFindManyResolve, ReplicaSchemaError<SqlError>> { 387 models::plot_tag::find_many(self.executor(), opts) 388 } 389 390 pub fn plot_tag_find_one( 391 &self, 392 opts: &IPlotTagFindOne, 393 ) -> Result<IPlotTagFindOneResolve, ReplicaSchemaError<SqlError>> { 394 models::plot_tag::find_one(self.executor(), opts) 395 } 396 397 pub fn plot_tag_update( 398 &self, 399 opts: &IPlotTagUpdate, 400 ) -> Result<IPlotTagUpdateResolve, ReplicaSchemaError<SqlError>> { 401 models::plot_tag::update(self.executor(), opts) 402 } 403 404 pub fn plot_tag_delete( 405 &self, 406 opts: &IPlotTagDelete, 407 ) -> Result<IPlotTagDeleteResolve, ReplicaSchemaError<SqlError>> { 408 models::plot_tag::delete(self.executor(), opts) 409 } 410 411 pub fn farm_member_create( 412 &self, 413 opts: &IFarmMemberCreate, 414 ) -> Result<IFarmMemberCreateResolve, ReplicaSchemaError<SqlError>> { 415 models::farm_member::create(self.executor(), opts) 416 } 417 418 pub fn farm_member_find_many( 419 &self, 420 opts: &IFarmMemberFindMany, 421 ) -> Result<IFarmMemberFindManyResolve, ReplicaSchemaError<SqlError>> { 422 models::farm_member::find_many(self.executor(), opts) 423 } 424 425 pub fn farm_member_find_one( 426 &self, 427 opts: &IFarmMemberFindOne, 428 ) -> Result<IFarmMemberFindOneResolve, ReplicaSchemaError<SqlError>> { 429 models::farm_member::find_one(self.executor(), opts) 430 } 431 432 pub fn farm_member_update( 433 &self, 434 opts: &IFarmMemberUpdate, 435 ) -> Result<IFarmMemberUpdateResolve, ReplicaSchemaError<SqlError>> { 436 models::farm_member::update(self.executor(), opts) 437 } 438 439 pub fn farm_member_delete( 440 &self, 441 opts: &IFarmMemberDelete, 442 ) -> Result<IFarmMemberDeleteResolve, ReplicaSchemaError<SqlError>> { 443 models::farm_member::delete(self.executor(), opts) 444 } 445 446 pub fn farm_member_claim_create( 447 &self, 448 opts: &IFarmMemberClaimCreate, 449 ) -> Result<IFarmMemberClaimCreateResolve, ReplicaSchemaError<SqlError>> { 450 models::farm_member_claim::create(self.executor(), opts) 451 } 452 453 pub fn farm_member_claim_find_many( 454 &self, 455 opts: &IFarmMemberClaimFindMany, 456 ) -> Result<IFarmMemberClaimFindManyResolve, ReplicaSchemaError<SqlError>> { 457 models::farm_member_claim::find_many(self.executor(), opts) 458 } 459 460 pub fn farm_member_claim_find_one( 461 &self, 462 opts: &IFarmMemberClaimFindOne, 463 ) -> Result<IFarmMemberClaimFindOneResolve, ReplicaSchemaError<SqlError>> { 464 models::farm_member_claim::find_one(self.executor(), opts) 465 } 466 467 pub fn farm_member_claim_update( 468 &self, 469 opts: &IFarmMemberClaimUpdate, 470 ) -> Result<IFarmMemberClaimUpdateResolve, ReplicaSchemaError<SqlError>> { 471 models::farm_member_claim::update(self.executor(), opts) 472 } 473 474 pub fn farm_member_claim_delete( 475 &self, 476 opts: &IFarmMemberClaimDelete, 477 ) -> Result<IFarmMemberClaimDeleteResolve, ReplicaSchemaError<SqlError>> { 478 models::farm_member_claim::delete(self.executor(), opts) 479 } 480 481 pub fn log_error_create( 482 &self, 483 opts: &ILogErrorCreate, 484 ) -> Result<ILogErrorCreateResolve, ReplicaSchemaError<SqlError>> { 485 models::log_error::create(self.executor(), opts) 486 } 487 488 pub fn log_error_find_many( 489 &self, 490 opts: &ILogErrorFindMany, 491 ) -> Result<ILogErrorFindManyResolve, ReplicaSchemaError<SqlError>> { 492 models::log_error::find_many(self.executor(), opts) 493 } 494 495 pub fn log_error_find_one( 496 &self, 497 opts: &ILogErrorFindOne, 498 ) -> Result<ILogErrorFindOneResolve, ReplicaSchemaError<SqlError>> { 499 models::log_error::find_one(self.executor(), opts) 500 } 501 502 pub fn log_error_update( 503 &self, 504 opts: &ILogErrorUpdate, 505 ) -> Result<ILogErrorUpdateResolve, ReplicaSchemaError<SqlError>> { 506 models::log_error::update(self.executor(), opts) 507 } 508 509 pub fn log_error_delete( 510 &self, 511 opts: &ILogErrorDelete, 512 ) -> Result<ILogErrorDeleteResolve, ReplicaSchemaError<SqlError>> { 513 models::log_error::delete(self.executor(), opts) 514 } 515 516 pub fn media_image_create( 517 &self, 518 opts: &IMediaImageCreate, 519 ) -> Result<IMediaImageCreateResolve, ReplicaSchemaError<SqlError>> { 520 models::media_image::create(self.executor(), opts) 521 } 522 523 pub fn media_image_find_many( 524 &self, 525 opts: &IMediaImageFindMany, 526 ) -> Result<IMediaImageFindManyResolve, ReplicaSchemaError<SqlError>> { 527 models::media_image::find_many(self.executor(), opts) 528 } 529 530 pub fn media_image_find_one( 531 &self, 532 opts: &IMediaImageFindOne, 533 ) -> Result<IMediaImageFindOneResolve, ReplicaSchemaError<SqlError>> { 534 models::media_image::find_one(self.executor(), opts) 535 } 536 537 pub fn media_image_update( 538 &self, 539 opts: &IMediaImageUpdate, 540 ) -> Result<IMediaImageUpdateResolve, ReplicaSchemaError<SqlError>> { 541 models::media_image::update(self.executor(), opts) 542 } 543 544 pub fn media_image_delete( 545 &self, 546 opts: &IMediaImageDelete, 547 ) -> Result<IMediaImageDeleteResolve, ReplicaSchemaError<SqlError>> { 548 models::media_image::delete(self.executor(), opts) 549 } 550 551 pub fn nostr_profile_create( 552 &self, 553 opts: &INostrProfileCreate, 554 ) -> Result<INostrProfileCreateResolve, ReplicaSchemaError<SqlError>> { 555 models::nostr_profile::create(self.executor(), opts) 556 } 557 558 pub fn nostr_profile_find_many( 559 &self, 560 opts: &INostrProfileFindMany, 561 ) -> Result<INostrProfileFindManyResolve, ReplicaSchemaError<SqlError>> { 562 models::nostr_profile::find_many(self.executor(), opts) 563 } 564 565 pub fn nostr_profile_find_one( 566 &self, 567 opts: &INostrProfileFindOne, 568 ) -> Result<INostrProfileFindOneResolve, ReplicaSchemaError<SqlError>> { 569 models::nostr_profile::find_one(self.executor(), opts) 570 } 571 572 pub fn nostr_profile_update( 573 &self, 574 opts: &INostrProfileUpdate, 575 ) -> Result<INostrProfileUpdateResolve, ReplicaSchemaError<SqlError>> { 576 models::nostr_profile::update(self.executor(), opts) 577 } 578 579 pub fn nostr_profile_delete( 580 &self, 581 opts: &INostrProfileDelete, 582 ) -> Result<INostrProfileDeleteResolve, ReplicaSchemaError<SqlError>> { 583 models::nostr_profile::delete(self.executor(), opts) 584 } 585 586 pub fn nostr_event_head_create( 587 &self, 588 opts: &INostrEventHeadCreate, 589 ) -> Result<INostrEventHeadCreateResolve, ReplicaSchemaError<SqlError>> { 590 models::nostr_event_head::create(self.executor(), opts) 591 } 592 593 pub fn nostr_event_head_find_many( 594 &self, 595 opts: &INostrEventHeadFindMany, 596 ) -> Result<INostrEventHeadFindManyResolve, ReplicaSchemaError<SqlError>> { 597 models::nostr_event_head::find_many(self.executor(), opts) 598 } 599 600 pub fn nostr_event_head_find_one( 601 &self, 602 opts: &INostrEventHeadFindOne, 603 ) -> Result<INostrEventHeadFindOneResolve, ReplicaSchemaError<SqlError>> { 604 models::nostr_event_head::find_one(self.executor(), opts) 605 } 606 607 pub fn nostr_event_head_update( 608 &self, 609 opts: &INostrEventHeadUpdate, 610 ) -> Result<INostrEventHeadUpdateResolve, ReplicaSchemaError<SqlError>> { 611 models::nostr_event_head::update(self.executor(), opts) 612 } 613 614 pub fn nostr_event_head_delete( 615 &self, 616 opts: &INostrEventHeadDelete, 617 ) -> Result<INostrEventHeadDeleteResolve, ReplicaSchemaError<SqlError>> { 618 models::nostr_event_head::delete(self.executor(), opts) 619 } 620 621 pub fn nostr_relay_create( 622 &self, 623 opts: &INostrRelayCreate, 624 ) -> Result<INostrRelayCreateResolve, ReplicaSchemaError<SqlError>> { 625 models::nostr_relay::create(self.executor(), opts) 626 } 627 628 pub fn nostr_relay_find_many( 629 &self, 630 opts: &INostrRelayFindMany, 631 ) -> Result<INostrRelayFindManyResolve, ReplicaSchemaError<SqlError>> { 632 models::nostr_relay::find_many(self.executor(), opts) 633 } 634 635 pub fn nostr_relay_find_one( 636 &self, 637 opts: &INostrRelayFindOne, 638 ) -> Result<INostrRelayFindOneResolve, ReplicaSchemaError<SqlError>> { 639 models::nostr_relay::find_one(self.executor(), opts) 640 } 641 642 pub fn nostr_relay_update( 643 &self, 644 opts: &INostrRelayUpdate, 645 ) -> Result<INostrRelayUpdateResolve, ReplicaSchemaError<SqlError>> { 646 models::nostr_relay::update(self.executor(), opts) 647 } 648 649 pub fn nostr_relay_delete( 650 &self, 651 opts: &INostrRelayDelete, 652 ) -> Result<INostrRelayDeleteResolve, ReplicaSchemaError<SqlError>> { 653 models::nostr_relay::delete(self.executor(), opts) 654 } 655 656 pub fn trade_product_create( 657 &self, 658 opts: &ITradeProductCreate, 659 ) -> Result<ITradeProductCreateResolve, ReplicaSchemaError<SqlError>> { 660 models::trade_product::create(self.executor(), opts) 661 } 662 663 pub fn trade_product_find_many( 664 &self, 665 opts: &ITradeProductFindMany, 666 ) -> Result<ITradeProductFindManyResolve, ReplicaSchemaError<SqlError>> { 667 models::trade_product::find_many(self.executor(), opts) 668 } 669 670 pub fn trade_product_find_one( 671 &self, 672 opts: &ITradeProductFindOne, 673 ) -> Result<ITradeProductFindOneResolve, ReplicaSchemaError<SqlError>> { 674 models::trade_product::find_one(self.executor(), opts) 675 } 676 677 pub fn trade_product_update( 678 &self, 679 opts: &ITradeProductUpdate, 680 ) -> Result<ITradeProductUpdateResolve, ReplicaSchemaError<SqlError>> { 681 models::trade_product::update(self.executor(), opts) 682 } 683 684 pub fn trade_product_delete( 685 &self, 686 opts: &ITradeProductDelete, 687 ) -> Result<ITradeProductDeleteResolve, ReplicaSchemaError<SqlError>> { 688 models::trade_product::delete(self.executor(), opts) 689 } 690 691 pub fn nostr_profile_relay_set( 692 &self, 693 opts: &INostrProfileRelayRelation, 694 ) -> Result<INostrProfileRelayResolve, ReplicaSchemaError<SqlError>> { 695 models::nostr_profile_relay::set(self.executor(), opts) 696 } 697 698 pub fn nostr_profile_relay_unset( 699 &self, 700 opts: &INostrProfileRelayRelation, 701 ) -> Result<INostrProfileRelayResolve, ReplicaSchemaError<SqlError>> { 702 models::nostr_profile_relay::unset(self.executor(), opts) 703 } 704 705 pub fn trade_product_location_set( 706 &self, 707 opts: &ITradeProductLocationRelation, 708 ) -> Result<ITradeProductLocationResolve, ReplicaSchemaError<SqlError>> { 709 models::trade_product_location::set(self.executor(), opts) 710 } 711 712 pub fn trade_product_location_unset( 713 &self, 714 opts: &ITradeProductLocationRelation, 715 ) -> Result<ITradeProductLocationResolve, ReplicaSchemaError<SqlError>> { 716 models::trade_product_location::unset(self.executor(), opts) 717 } 718 719 pub fn trade_product_media_set( 720 &self, 721 opts: &ITradeProductMediaRelation, 722 ) -> Result<ITradeProductMediaResolve, ReplicaSchemaError<SqlError>> { 723 models::trade_product_media::set(self.executor(), opts) 724 } 725 726 pub fn trade_product_media_unset( 727 &self, 728 opts: &ITradeProductMediaRelation, 729 ) -> Result<ITradeProductMediaResolve, ReplicaSchemaError<SqlError>> { 730 models::trade_product_media::unset(self.executor(), opts) 731 } 732 } 733 734 #[cfg(test)] 735 mod tests { 736 use super::ReplicaSql; 737 use radroots_sql_core::{ExecOutcome, SqlError, SqlExecutor}; 738 739 struct ProbeExecutor; 740 741 impl SqlExecutor for ProbeExecutor { 742 fn exec(&self, _sql: &str, _params_json: &str) -> Result<ExecOutcome, SqlError> { 743 Ok(ExecOutcome { 744 changes: 0, 745 last_insert_id: 0, 746 }) 747 } 748 749 fn query_raw(&self, _sql: &str, _params_json: &str) -> Result<String, SqlError> { 750 Ok("[]".to_string()) 751 } 752 753 fn begin(&self) -> Result<(), SqlError> { 754 Ok(()) 755 } 756 757 fn commit(&self) -> Result<(), SqlError> { 758 Ok(()) 759 } 760 761 fn rollback(&self) -> Result<(), SqlError> { 762 Ok(()) 763 } 764 } 765 766 #[test] 767 fn replica_sql_constructor_and_executor_access_are_supported() { 768 let db = ReplicaSql::new(ProbeExecutor); 769 let exec = db.executor(); 770 assert!(exec.exec("select 1", "[]").is_ok()); 771 assert!(exec.query_raw("select 1", "[]").is_ok()); 772 assert!(exec.begin().is_ok()); 773 assert!(exec.commit().is_ok()); 774 assert!(exec.rollback().is_ok()); 775 assert_eq!( 776 ReplicaSql::<ProbeExecutor>::coverage_branch_probe(true), 777 "enabled" 778 ); 779 assert_eq!( 780 ReplicaSql::<ProbeExecutor>::coverage_branch_probe(false), 781 "disabled" 782 ); 783 } 784 }