mirror of
https://github.com/storytold/artcraft.git
synced 2026-10-20 17:02:53 -04:00
support endpoints for looking up payments entities (#1102)
This will make support and issuing refunds easier
This commit is contained in:
+102
@@ -0,0 +1,102 @@
|
||||
{
|
||||
"db_name": "MySQL",
|
||||
"query": "\nSELECT\n w.token as `token: tokens::tokens::wallets::WalletToken`,\n w.wallet_namespace as `wallet_namespace: enums::common::payments_namespace::PaymentsNamespace`,\n w.owner_user_token as `owner_user_token: tokens::tokens::users::UserToken`,\n w.banked_credits as `banked_credits: u32`,\n w.monthly_credits as `monthly_credits: u32`,\n w.version,\n w.created_at as `created_at: DateTime<Utc>`,\n w.updated_at as `updated_at: DateTime<Utc>`\nFROM wallets as w\nWHERE w.token = ?\nLIMIT 1\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "token: tokens::tokens::wallets::WalletToken",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
|
||||
"char_set": 224,
|
||||
"max_size": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "wallet_namespace: enums::common::payments_namespace::PaymentsNamespace",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
|
||||
"char_set": 224,
|
||||
"max_size": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "owner_user_token: tokens::tokens::users::UserToken",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
|
||||
"char_set": 224,
|
||||
"max_size": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "banked_credits: u32",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL | UNSIGNED",
|
||||
"char_set": 63,
|
||||
"max_size": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "monthly_credits: u32",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL | UNSIGNED",
|
||||
"char_set": 63,
|
||||
"max_size": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"name": "version",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL",
|
||||
"char_set": 63,
|
||||
"max_size": 11
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"name": "created_at: DateTime<Utc>",
|
||||
"type_info": {
|
||||
"type": "Timestamp",
|
||||
"flags": "NOT_NULL | BINARY | TIMESTAMP",
|
||||
"char_set": 63,
|
||||
"max_size": 19
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"name": "updated_at: DateTime<Utc>",
|
||||
"type_info": {
|
||||
"type": "Timestamp",
|
||||
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
|
||||
"char_set": 63,
|
||||
"max_size": 19
|
||||
}
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "35b09082ebb923c8c3191eaee8553b7c3badbd9152ee43999f7c8ff1a6410fe9"
|
||||
}
|
||||
+135
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"db_name": "MySQL",
|
||||
"query": "\nSELECT\n token as `token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,\n entry_type as `entry_type: enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType`,\n maybe_entity_ref,\n credits_delta,\n banked_credits_before as `banked_credits_before: u32`,\n banked_credits_after as `banked_credits_after: u32`,\n monthly_credits_before as `monthly_credits_before: u32`,\n monthly_credits_after as `monthly_credits_after: u32`,\n is_refunded as `is_refunded: bool`,\n maybe_linked_refund_ledger_token as `maybe_linked_refund_ledger_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,\n created_at as `created_at: DateTime<Utc>`\nFROM wallet_ledger_entries\nWHERE token = ?\nLIMIT 1\n ",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"ordinal": 0,
|
||||
"name": "token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
|
||||
"char_set": 224,
|
||||
"max_size": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 1,
|
||||
"name": "entry_type: enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
|
||||
"char_set": 224,
|
||||
"max_size": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"name": "maybe_entity_ref",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "BINARY",
|
||||
"char_set": 224,
|
||||
"max_size": 1020
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"name": "credits_delta",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL",
|
||||
"char_set": 63,
|
||||
"max_size": 11
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"name": "banked_credits_before: u32",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL | UNSIGNED",
|
||||
"char_set": 63,
|
||||
"max_size": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"name": "banked_credits_after: u32",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL | UNSIGNED",
|
||||
"char_set": 63,
|
||||
"max_size": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"name": "monthly_credits_before: u32",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL | UNSIGNED",
|
||||
"char_set": 63,
|
||||
"max_size": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"name": "monthly_credits_after: u32",
|
||||
"type_info": {
|
||||
"type": "Long",
|
||||
"flags": "NOT_NULL | UNSIGNED",
|
||||
"char_set": 63,
|
||||
"max_size": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"name": "is_refunded: bool",
|
||||
"type_info": {
|
||||
"type": "Tiny",
|
||||
"flags": "NOT_NULL",
|
||||
"char_set": 63,
|
||||
"max_size": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"name": "maybe_linked_refund_ledger_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken",
|
||||
"type_info": {
|
||||
"type": "VarString",
|
||||
"flags": "BINARY",
|
||||
"char_set": 224,
|
||||
"max_size": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
"ordinal": 10,
|
||||
"name": "created_at: DateTime<Utc>",
|
||||
"type_info": {
|
||||
"type": "Timestamp",
|
||||
"flags": "NOT_NULL | BINARY | TIMESTAMP",
|
||||
"char_set": 63,
|
||||
"max_size": 19
|
||||
}
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "9c28e9f8f163407755acaca1fb4a72849679b6bf98b8c87e1761200300111232"
|
||||
}
|
||||
+1
@@ -1 +1,2 @@
|
||||
pub mod list_wallet_ledger_entries_by_wallet;
|
||||
pub mod moderator_get_wallet_ledger_entry;
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
use chrono::{DateTime, Utc};
|
||||
use enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType;
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
pub const MODERATOR_GET_WALLET_LEDGER_ENTRY_PATH: &str = "/v1/moderation/wallet_ledger_entry/{wallet_ledger_entry_token}";
|
||||
|
||||
#[derive(Deserialize, ToSchema)]
|
||||
pub struct ModeratorGetWalletLedgerEntryPathInfo {
|
||||
pub wallet_ledger_entry_token: WalletLedgerEntryToken,
|
||||
}
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct ModeratorGetWalletLedgerEntryResponse {
|
||||
pub success: bool,
|
||||
pub maybe_entry: Option<ModeratorGetWalletLedgerEntryDetails>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct ModeratorGetWalletLedgerEntryDetails {
|
||||
pub token: WalletLedgerEntryToken,
|
||||
pub entry_type: WalletLedgerEntryType,
|
||||
pub maybe_entity_ref: Option<String>,
|
||||
pub credits_delta: i32,
|
||||
pub banked_credits_before: u32,
|
||||
pub banked_credits_after: u32,
|
||||
pub monthly_credits_before: u32,
|
||||
pub monthly_credits_after: u32,
|
||||
pub is_refunded: bool,
|
||||
pub maybe_linked_refund_ledger_token: Option<WalletLedgerEntryToken>,
|
||||
pub created_at: DateTime<Utc>,
|
||||
}
|
||||
@@ -1 +1,2 @@
|
||||
pub mod list_user_wallets;
|
||||
pub mod moderator_get_wallet;
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
use chrono::{DateTime, Utc};
|
||||
use enums::common::payments_namespace::PaymentsNamespace;
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use tokens::tokens::users::UserToken;
|
||||
use tokens::tokens::wallets::WalletToken;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
pub const MODERATOR_GET_WALLET_PATH: &str = "/v1/moderation/wallet/{wallet_token}";
|
||||
|
||||
#[derive(Deserialize, ToSchema)]
|
||||
pub struct ModeratorGetWalletPathInfo {
|
||||
pub wallet_token: WalletToken,
|
||||
}
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct ModeratorGetWalletResponse {
|
||||
pub success: bool,
|
||||
pub maybe_wallet: Option<ModeratorGetWalletDetails>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct ModeratorGetWalletDetails {
|
||||
pub token: WalletToken,
|
||||
pub wallet_namespace: PaymentsNamespace,
|
||||
pub owner_user_token: UserToken,
|
||||
pub banked_credits: u32,
|
||||
pub monthly_credits: u32,
|
||||
pub version: i32,
|
||||
pub created_at: DateTime<Utc>,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
use anyhow::anyhow;
|
||||
use log::warn;
|
||||
use sqlx::MySqlPool;
|
||||
|
||||
use chrono::{DateTime, Utc};
|
||||
use enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType;
|
||||
use errors::AnyhowResult;
|
||||
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
|
||||
|
||||
pub struct WalletLedgerEntryForModerationResult {
|
||||
pub token: WalletLedgerEntryToken,
|
||||
pub entry_type: WalletLedgerEntryType,
|
||||
pub maybe_entity_ref: Option<String>,
|
||||
pub credits_delta: i32,
|
||||
pub banked_credits_before: u32,
|
||||
pub banked_credits_after: u32,
|
||||
pub monthly_credits_before: u32,
|
||||
pub monthly_credits_after: u32,
|
||||
pub is_refunded: bool,
|
||||
pub maybe_linked_refund_ledger_token: Option<WalletLedgerEntryToken>,
|
||||
pub created_at: DateTime<Utc>,
|
||||
}
|
||||
|
||||
pub async fn get_wallet_ledger_entry_for_moderation(
|
||||
wallet_ledger_entry_token: &WalletLedgerEntryToken,
|
||||
mysql_pool: &MySqlPool,
|
||||
) -> AnyhowResult<Option<WalletLedgerEntryForModerationResult>> {
|
||||
let result = sqlx::query_as!(
|
||||
WalletLedgerEntryForModerationResult,
|
||||
r#"
|
||||
SELECT
|
||||
token as `token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,
|
||||
entry_type as `entry_type: enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType`,
|
||||
maybe_entity_ref,
|
||||
credits_delta,
|
||||
banked_credits_before as `banked_credits_before: u32`,
|
||||
banked_credits_after as `banked_credits_after: u32`,
|
||||
monthly_credits_before as `monthly_credits_before: u32`,
|
||||
monthly_credits_after as `monthly_credits_after: u32`,
|
||||
is_refunded as `is_refunded: bool`,
|
||||
maybe_linked_refund_ledger_token as `maybe_linked_refund_ledger_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,
|
||||
created_at as `created_at: DateTime<Utc>`
|
||||
FROM wallet_ledger_entries
|
||||
WHERE token = ?
|
||||
LIMIT 1
|
||||
"#,
|
||||
wallet_ledger_entry_token,
|
||||
)
|
||||
.fetch_one(mysql_pool)
|
||||
.await;
|
||||
|
||||
match result {
|
||||
Ok(record) => Ok(Some(record)),
|
||||
Err(sqlx::Error::RowNotFound) => Ok(None),
|
||||
Err(err) => {
|
||||
warn!("get_wallet_ledger_entry_for_moderation query error: {:?}", err);
|
||||
Err(anyhow!("query error"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
pub (crate) mod internal_insert_wallet_ledger_entry;
|
||||
pub mod internal_insert_wallet_created_ledger_entry;
|
||||
pub mod get_wallet_ledger_entry_for_moderation;
|
||||
pub mod list_wallet_ledger_entries_by_wallet;
|
||||
@@ -0,0 +1,55 @@
|
||||
use anyhow::anyhow;
|
||||
use log::warn;
|
||||
use sqlx::MySqlPool;
|
||||
|
||||
use chrono::{DateTime, Utc};
|
||||
use enums::common::payments_namespace::PaymentsNamespace;
|
||||
use errors::AnyhowResult;
|
||||
use tokens::tokens::users::UserToken;
|
||||
use tokens::tokens::wallets::WalletToken;
|
||||
|
||||
pub struct WalletForModerationResult {
|
||||
pub token: WalletToken,
|
||||
pub wallet_namespace: PaymentsNamespace,
|
||||
pub owner_user_token: UserToken,
|
||||
pub banked_credits: u32,
|
||||
pub monthly_credits: u32,
|
||||
pub version: i32,
|
||||
pub created_at: DateTime<Utc>,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
}
|
||||
|
||||
pub async fn get_wallet_for_moderation(
|
||||
wallet_token: &WalletToken,
|
||||
mysql_pool: &MySqlPool,
|
||||
) -> AnyhowResult<Option<WalletForModerationResult>> {
|
||||
let result = sqlx::query_as!(
|
||||
WalletForModerationResult,
|
||||
r#"
|
||||
SELECT
|
||||
w.token as `token: tokens::tokens::wallets::WalletToken`,
|
||||
w.wallet_namespace as `wallet_namespace: enums::common::payments_namespace::PaymentsNamespace`,
|
||||
w.owner_user_token as `owner_user_token: tokens::tokens::users::UserToken`,
|
||||
w.banked_credits as `banked_credits: u32`,
|
||||
w.monthly_credits as `monthly_credits: u32`,
|
||||
w.version,
|
||||
w.created_at as `created_at: DateTime<Utc>`,
|
||||
w.updated_at as `updated_at: DateTime<Utc>`
|
||||
FROM wallets as w
|
||||
WHERE w.token = ?
|
||||
LIMIT 1
|
||||
"#,
|
||||
wallet_token,
|
||||
)
|
||||
.fetch_one(mysql_pool)
|
||||
.await;
|
||||
|
||||
match result {
|
||||
Ok(record) => Ok(Some(record)),
|
||||
Err(sqlx::Error::RowNotFound) => Ok(None),
|
||||
Err(err) => {
|
||||
warn!("get_wallet_for_moderation query error: {:?}", err);
|
||||
Err(anyhow!("query error"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,5 +6,6 @@ pub mod find_primary_wallet_token_for_owner;
|
||||
pub mod refill_monthly_credits_balance_on_wallet;
|
||||
pub mod refund;
|
||||
pub mod spend;
|
||||
pub mod get_wallet_for_moderation;
|
||||
pub mod list_user_wallets_for_moderation;
|
||||
pub mod wallet_update_summary;
|
||||
@@ -269,7 +269,9 @@ use artcraft_api_defs::moderation::user::user_lookup::*;
|
||||
use artcraft_api_defs::moderation::user::user_lookup_by_stripe_customer_id::*;
|
||||
use artcraft_api_defs::moderation::jobs::user::list_user_jobs::*;
|
||||
use artcraft_api_defs::moderation::wallet_ledger_entries::list_wallet_ledger_entries_by_wallet::*;
|
||||
use artcraft_api_defs::moderation::wallet_ledger_entries::moderator_get_wallet_ledger_entry::*;
|
||||
use artcraft_api_defs::moderation::wallets::list_user_wallets::*;
|
||||
use artcraft_api_defs::moderation::wallets::moderator_get_wallet::*;
|
||||
use crate::http_server::endpoints::webhooks::fal_webhook_handler::*;
|
||||
use crate::http_server::endpoints::image_studio::update_gpt_image_job_status_handler::*;
|
||||
use crate::http_server::endpoints::voice_conversion::enqueue_seed_vc_inference_handler::*;
|
||||
@@ -443,7 +445,9 @@ use crate::http_server::endpoints::media_files::list::list_batch_generated_redux
|
||||
crate::http_server::endpoints::moderation::user::moderator_user_lookup_by_stripe_customer_id_handler::moderator_user_lookup_by_stripe_customer_id_handler,
|
||||
crate::http_server::endpoints::moderation::jobs::user::list_user_jobs_handler::list_user_jobs_handler,
|
||||
crate::http_server::endpoints::moderation::wallet_ledger_entries::list_wallet_ledger_entries_by_wallet_handler::list_wallet_ledger_entries_by_wallet_handler,
|
||||
crate::http_server::endpoints::moderation::wallet_ledger_entries::moderator_get_wallet_ledger_entry_handler::moderator_get_wallet_ledger_entry_handler,
|
||||
crate::http_server::endpoints::moderation::wallets::list_user_wallets_handler::list_user_wallets_handler,
|
||||
crate::http_server::endpoints::moderation::wallets::moderator_get_wallet_handler::moderator_get_wallet_handler,
|
||||
// Credits
|
||||
crate::http_server::endpoints::credits::get_session_credits_handler::get_session_credits_handler,
|
||||
// Subscriptions
|
||||
@@ -636,6 +640,12 @@ use crate::http_server::endpoints::media_files::list::list_batch_generated_redux
|
||||
ListWalletLedgerEntriesByWalletPathInfo,
|
||||
ListWalletLedgerEntriesByWalletResponse,
|
||||
ListWalletLedgerEntriesByWalletEntry,
|
||||
ModeratorGetWalletPathInfo,
|
||||
ModeratorGetWalletResponse,
|
||||
ModeratorGetWalletDetails,
|
||||
ModeratorGetWalletLedgerEntryPathInfo,
|
||||
ModeratorGetWalletLedgerEntryResponse,
|
||||
ModeratorGetWalletLedgerEntryDetails,
|
||||
GptImage1EditImageRequest,
|
||||
GptImage1EditImageImageSize,
|
||||
GptImage1EditImageNumImages,
|
||||
|
||||
+1
@@ -1 +1,2 @@
|
||||
pub mod list_wallet_ledger_entries_by_wallet_handler;
|
||||
pub mod moderator_get_wallet_ledger_entry_handler;
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use actix_web::web::{Json, Path};
|
||||
use actix_web::{web, HttpRequest};
|
||||
use log::warn;
|
||||
|
||||
use artcraft_api_defs::moderation::wallet_ledger_entries::moderator_get_wallet_ledger_entry::{
|
||||
ModeratorGetWalletLedgerEntryDetails,
|
||||
ModeratorGetWalletLedgerEntryPathInfo,
|
||||
ModeratorGetWalletLedgerEntryResponse,
|
||||
};
|
||||
use mysql_queries::queries::wallet_ledger_entries::get_wallet_ledger_entry_for_moderation::get_wallet_ledger_entry_for_moderation;
|
||||
|
||||
use crate::http_server::common_responses::common_web_error::CommonWebError;
|
||||
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
|
||||
use crate::state::server_state::ServerState;
|
||||
|
||||
/// Get a single wallet ledger entry by token (moderation)
|
||||
#[utoipa::path(
|
||||
get,
|
||||
tag = "Moderation",
|
||||
path = "/v1/moderation/wallet_ledger_entry/{wallet_ledger_entry_token}",
|
||||
responses(
|
||||
(status = 200, description = "Success", body = ModeratorGetWalletLedgerEntryResponse),
|
||||
(status = 401, description = "Unauthorized"),
|
||||
(status = 500, description = "Server error"),
|
||||
),
|
||||
params(
|
||||
("wallet_ledger_entry_token" = WalletLedgerEntryToken, Path, description = "Wallet ledger entry token to look up"),
|
||||
)
|
||||
)]
|
||||
pub async fn moderator_get_wallet_ledger_entry_handler(
|
||||
http_request: HttpRequest,
|
||||
path: Path<ModeratorGetWalletLedgerEntryPathInfo>,
|
||||
server_state: web::Data<Arc<ServerState>>,
|
||||
) -> Result<Json<ModeratorGetWalletLedgerEntryResponse>, CommonWebError> {
|
||||
|
||||
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
|
||||
.await
|
||||
.map_err(|_| CommonWebError::NotAuthorized)?;
|
||||
|
||||
let maybe_entry = get_wallet_ledger_entry_for_moderation(&path.wallet_ledger_entry_token, &server_state.mysql_pool)
|
||||
.await
|
||||
.map_err(|err| {
|
||||
warn!("moderator_get_wallet_ledger_entry error: {:?}", err);
|
||||
CommonWebError::ServerError
|
||||
})?;
|
||||
|
||||
let maybe_entry_details = maybe_entry.map(|entry| ModeratorGetWalletLedgerEntryDetails {
|
||||
token: entry.token,
|
||||
entry_type: entry.entry_type,
|
||||
maybe_entity_ref: entry.maybe_entity_ref,
|
||||
credits_delta: entry.credits_delta,
|
||||
banked_credits_before: entry.banked_credits_before,
|
||||
banked_credits_after: entry.banked_credits_after,
|
||||
monthly_credits_before: entry.monthly_credits_before,
|
||||
monthly_credits_after: entry.monthly_credits_after,
|
||||
is_refunded: entry.is_refunded,
|
||||
maybe_linked_refund_ledger_token: entry.maybe_linked_refund_ledger_token,
|
||||
created_at: entry.created_at,
|
||||
});
|
||||
|
||||
Ok(Json(ModeratorGetWalletLedgerEntryResponse {
|
||||
success: true,
|
||||
maybe_entry: maybe_entry_details,
|
||||
}))
|
||||
}
|
||||
@@ -1 +1,2 @@
|
||||
pub mod list_user_wallets_handler;
|
||||
pub mod moderator_get_wallet_handler;
|
||||
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use actix_web::web::{Json, Path};
|
||||
use actix_web::{web, HttpRequest};
|
||||
use log::warn;
|
||||
|
||||
use artcraft_api_defs::moderation::wallets::moderator_get_wallet::{
|
||||
ModeratorGetWalletDetails,
|
||||
ModeratorGetWalletPathInfo,
|
||||
ModeratorGetWalletResponse,
|
||||
};
|
||||
use mysql_queries::queries::wallets::get_wallet_for_moderation::get_wallet_for_moderation;
|
||||
|
||||
use crate::http_server::common_responses::common_web_error::CommonWebError;
|
||||
use crate::http_server::web_utils::user_session::require_moderator::{require_moderator, UseDatabase};
|
||||
use crate::state::server_state::ServerState;
|
||||
|
||||
/// Get a single wallet by token (moderation)
|
||||
#[utoipa::path(
|
||||
get,
|
||||
tag = "Moderation",
|
||||
path = "/v1/moderation/wallet/{wallet_token}",
|
||||
responses(
|
||||
(status = 200, description = "Success", body = ModeratorGetWalletResponse),
|
||||
(status = 401, description = "Unauthorized"),
|
||||
(status = 500, description = "Server error"),
|
||||
),
|
||||
params(
|
||||
("wallet_token" = WalletToken, Path, description = "Wallet token to look up"),
|
||||
)
|
||||
)]
|
||||
pub async fn moderator_get_wallet_handler(
|
||||
http_request: HttpRequest,
|
||||
path: Path<ModeratorGetWalletPathInfo>,
|
||||
server_state: web::Data<Arc<ServerState>>,
|
||||
) -> Result<Json<ModeratorGetWalletResponse>, CommonWebError> {
|
||||
|
||||
let _user_session = require_moderator(&http_request, &server_state, UseDatabase::GrabNewConnection)
|
||||
.await
|
||||
.map_err(|_| CommonWebError::NotAuthorized)?;
|
||||
|
||||
let maybe_wallet = get_wallet_for_moderation(&path.wallet_token, &server_state.mysql_pool)
|
||||
.await
|
||||
.map_err(|err| {
|
||||
warn!("moderator_get_wallet error: {:?}", err);
|
||||
CommonWebError::ServerError
|
||||
})?;
|
||||
|
||||
let maybe_wallet_details = maybe_wallet.map(|wallet| ModeratorGetWalletDetails {
|
||||
token: wallet.token,
|
||||
wallet_namespace: wallet.wallet_namespace,
|
||||
owner_user_token: wallet.owner_user_token,
|
||||
banked_credits: wallet.banked_credits,
|
||||
monthly_credits: wallet.monthly_credits,
|
||||
version: wallet.version,
|
||||
created_at: wallet.created_at,
|
||||
updated_at: wallet.updated_at,
|
||||
});
|
||||
|
||||
Ok(Json(ModeratorGetWalletResponse {
|
||||
success: true,
|
||||
maybe_wallet: maybe_wallet_details,
|
||||
}))
|
||||
}
|
||||
+10
@@ -21,7 +21,9 @@ use crate::http_server::endpoints::moderation::ip_bans::get_ip_ban::get_ip_ban_h
|
||||
use crate::http_server::endpoints::moderation::ip_bans::list_ip_bans::list_ip_bans_handler;
|
||||
use crate::http_server::endpoints::moderation::jobs::user::list_user_jobs_handler::list_user_jobs_handler;
|
||||
use crate::http_server::endpoints::moderation::wallet_ledger_entries::list_wallet_ledger_entries_by_wallet_handler::list_wallet_ledger_entries_by_wallet_handler;
|
||||
use crate::http_server::endpoints::moderation::wallet_ledger_entries::moderator_get_wallet_ledger_entry_handler::moderator_get_wallet_ledger_entry_handler;
|
||||
use crate::http_server::endpoints::moderation::wallets::list_user_wallets_handler::list_user_wallets_handler;
|
||||
use crate::http_server::endpoints::moderation::wallets::moderator_get_wallet_handler::moderator_get_wallet_handler;
|
||||
use crate::http_server::endpoints::moderation::jobs::get_tts_inference_queue_count::get_tts_inference_queue_count_handler;
|
||||
use crate::http_server::endpoints::moderation::jobs::get_w2l_inference_queue_count::get_w2l_inference_queue_count_handler;
|
||||
use crate::http_server::endpoints::moderation::jobs::kill_tts_inference_jobs::kill_tts_inference_jobs_handler;
|
||||
@@ -63,12 +65,20 @@ pub fn add_moderator_routes<T, B> (app: App<T>) -> App<T>
|
||||
.route(web::head().to(|| HttpResponse::Ok()))
|
||||
)
|
||||
)
|
||||
.service(web::resource("/wallet/{wallet_token}")
|
||||
.route(web::get().to(moderator_get_wallet_handler))
|
||||
.route(web::head().to(|| HttpResponse::Ok()))
|
||||
)
|
||||
.service(web::scope("/wallets")
|
||||
.service(web::resource("/user/{user_token}/list")
|
||||
.route(web::get().to(list_user_wallets_handler))
|
||||
.route(web::head().to(|| HttpResponse::Ok()))
|
||||
)
|
||||
)
|
||||
.service(web::resource("/wallet_ledger_entry/{wallet_ledger_entry_token}")
|
||||
.route(web::get().to(moderator_get_wallet_ledger_entry_handler))
|
||||
.route(web::head().to(|| HttpResponse::Ok()))
|
||||
)
|
||||
.service(web::scope("/wallet_ledger_entries")
|
||||
.service(web::resource("/wallet/{wallet_token}/list")
|
||||
.route(web::get().to(list_wallet_ledger_entries_by_wallet_handler))
|
||||
|
||||
Reference in New Issue
Block a user