import 'package:drift/drift.dart' as drift; import 'package:drift_postgres/drift_postgres.dart'; import 'package:mnemo_cards_backend/database/database.dart'; import 'package:mnemo_cards_backend/repository/export.dart'; import 'package:mnemo_cards_common/mnemo_cards_common.dart'; import 'package:mnemo_cards_common_backend/mnemo_cards_common_backend.dart'; /// Extension для конвертации DiscountCampaign (Drift) в DTO extension DiscountCampaignToDto on DiscountCampaign { Future toDto( DiscountRepository discountRepository, ) async { final discounts = await discountRepository.getDiscountsByCampaignId(id); final discountsDto = discounts.map((d) => d.toDto()).toList(); DiscountCampaignStatus statusEnum; switch (status) { case 'created': statusEnum = DiscountCampaignStatus.created; break; case 'active': statusEnum = DiscountCampaignStatus.active; break; case 'expired': statusEnum = DiscountCampaignStatus.expired; break; case 'disabled': statusEnum = DiscountCampaignStatus.disabled; break; default: statusEnum = DiscountCampaignStatus.created; } return DiscountCampaignDto( id: id, start: start.dateTime, finish: finish.dateTime, status: statusEnum, name: name, tags: tags, discounts: discountsDto, ); } } /// Extension для конвертации Discount (Drift) в DTO extension DiscountToDto on Discount { DiscountDto toDto() { final productsList = products .map((p) { if (p is Map) { return MnemoCardsProductDto.fromJson(p); } return null; }) .whereType() .toList(); return DiscountDto( discountPercent: discountPercent, products: productsList, id: id.toString(), ); } } /// Extension для конвертации DiscountCampaignDto в DiscountCampaignsCompanion extension DiscountCampaignDtoToCompanion on DiscountCampaignDto { DiscountCampaignsCompanion toCompanion() { String statusStr; switch (status) { case DiscountCampaignStatus.created: statusStr = 'created'; break; case DiscountCampaignStatus.active: statusStr = 'active'; break; case DiscountCampaignStatus.expired: statusStr = 'expired'; break; case DiscountCampaignStatus.disabled: statusStr = 'disabled'; break; } return DiscountCampaignsCompanion.insert( id: id != null ? drift.Value(id!) : const drift.Value.absent(), name: drift.Value(name), start: PgDateTime(start), finish: PgDateTime(finish), status: statusStr, tags: drift.Value(tags), ); } } /// Extension для конвертации DiscountDto в DiscountsCompanion extension DiscountDtoToCompanion on DiscountDto { DiscountsCompanion toCompanion(String campaignId) { final productsJson = products.map((p) => p.toJson()).toList(); return DiscountsCompanion.insert( campaignId: campaignId, discountPercent: discountPercent, products: drift.Value(productsJson), ); } } /// Helper для конвертации статуса в строку String discountCampaignStatusToString(DiscountCampaignModelStatus status) { switch (status) { case DiscountCampaignModelStatus.created: return 'created'; case DiscountCampaignModelStatus.active: return 'active'; case DiscountCampaignModelStatus.expired: return 'expired'; case DiscountCampaignModelStatus.disabled: return 'disabled'; } } /// Helper для конвертации строки в статус DiscountCampaignModelStatus? discountCampaignStatusFromString(String? status) { if (status == null) return null; switch (status) { case 'created': return DiscountCampaignModelStatus.created; case 'active': return DiscountCampaignModelStatus.active; case 'expired': return DiscountCampaignModelStatus.expired; case 'disabled': return DiscountCampaignModelStatus.disabled; default: return null; } }