Files
pawctioneer-bot/src/db/models/new_listing.rs
Dylan Knutson 34de9b6d59 Major refactor: restructure new listing command and update data models
- Refactor new_listing from single file to modular structure
- Add handler factory pattern for state management
- Improve keyboard utilities and validations
- Update database models for bid, listing, and user systems
- Add new types: listing_duration, user_row_id
- Remove deprecated user_id type
- Update Docker configuration
- Enhance test utilities and message handling
2025-08-29 10:21:39 -07:00

135 lines
3.5 KiB
Rust

use crate::db::{ListingType, MoneyAmount, UserRowId};
use chrono::{DateTime, Utc};
/// New listing data for insertion
#[derive(Debug, Clone)]
pub struct NewListing {
pub base: NewListingBase,
pub fields: NewListingFields,
}
impl NewListing {
pub fn listing_type(&self) -> ListingType {
match &self.fields {
NewListingFields::BasicAuction { .. } => ListingType::BasicAuction,
NewListingFields::MultiSlotAuction { .. } => ListingType::MultiSlotAuction,
NewListingFields::FixedPriceListing { .. } => ListingType::FixedPriceListing,
NewListingFields::BlindAuction { .. } => ListingType::BlindAuction,
}
}
}
#[derive(Debug, Clone)]
pub struct NewListingBase {
pub seller_id: UserRowId,
pub title: String,
pub description: Option<String>,
pub starts_at: DateTime<Utc>,
pub ends_at: DateTime<Utc>,
}
#[derive(Debug, Clone)]
pub enum NewListingFields {
BasicAuction {
starting_bid: MoneyAmount,
buy_now_price: Option<MoneyAmount>,
min_increment: MoneyAmount,
anti_snipe_minutes: Option<i32>,
},
MultiSlotAuction {
starting_bid: MoneyAmount,
buy_now_price: MoneyAmount,
min_increment: Option<MoneyAmount>,
slots_available: i32,
anti_snipe_minutes: i32,
},
FixedPriceListing {
buy_now_price: MoneyAmount,
slots_available: i32,
},
BlindAuction {
starting_bid: MoneyAmount,
},
}
impl NewListingBase {
pub fn new(
seller_id: UserRowId,
title: String,
description: Option<String>,
starts_at: DateTime<Utc>,
ends_at: DateTime<Utc>,
) -> Self {
Self {
seller_id,
title,
description,
starts_at,
ends_at,
}
}
/// Create a new basic auction listing
pub fn new_basic_auction(
self,
starting_bid: MoneyAmount,
buy_now_price: Option<MoneyAmount>,
min_increment: MoneyAmount,
anti_snipe_minutes: Option<i32>,
) -> NewListing {
NewListing {
base: self,
fields: NewListingFields::BasicAuction {
starting_bid,
buy_now_price,
min_increment,
anti_snipe_minutes,
},
}
}
/// Create a new multi-slot auction listing
pub fn new_multi_slot_auction(
self,
starting_bid: MoneyAmount,
buy_now_price: MoneyAmount,
min_increment: Option<MoneyAmount>,
slots_available: i32,
anti_snipe_minutes: i32,
) -> NewListing {
NewListing {
base: self,
fields: NewListingFields::MultiSlotAuction {
starting_bid,
buy_now_price,
min_increment,
slots_available,
anti_snipe_minutes,
},
}
}
/// Create a new fixed price listing
pub fn new_fixed_price_listing(
self,
buy_now_price: MoneyAmount,
slots_available: i32,
) -> NewListing {
NewListing {
base: self,
fields: NewListingFields::FixedPriceListing {
buy_now_price,
slots_available,
},
}
}
/// Create a new blind auction listing
pub fn new_blind_auction(self, starting_bid: MoneyAmount) -> NewListing {
NewListing {
base: self,
fields: NewListingFields::BlindAuction { starting_bid },
}
}
}