import 'package:patbond_flutter/core/network/api_exception.dart'; /// pets 域类型化业务异常(契约 v1.2.0 定型的 8 个新错误码, /// 21 号收口报告 §1)。全部继承 [ApiBusinessException], /// 既有按基类捕获的通用错误处理不受影响。 /// 40300:对可见宠物无相应操作权限(viewer 写记录、caregiver/viewer 改档案)。 final class PetAccessDeniedException extends ApiBusinessException { const PetAccessDeniedException({required super.message}) : super(code: ApiCodes.petAccessDenied); } /// 40401:宠物不存在 / 已软删 / 与调用者无关系(防枚举,三种情况响应一致)。 final class PetNotFoundException extends ApiBusinessException { const PetNotFoundException({required super.message}) : super(code: ApiCodes.petNotFound); } /// 40402:记录不存在或记录所属宠物对调用者不可见(记录级防枚举)。 final class PetRecordNotFoundException extends ApiBusinessException { const PetRecordNotFoundException({required super.message}) : super(code: ApiCodes.recordNotFound); } /// 40902:乐观锁版本冲突(version 过期;提醒的条件更新守卫落空同码)。 /// 客户端处理:刷新取新数据后重提。 final class PetVersionConflictException extends ApiBusinessException { const PetVersionConflictException({required super.message}) : super(code: ApiCodes.versionConflict); } /// 40903:芯片号已被登记(跨用户唯一)。 final class MicrochipTakenException extends ApiBusinessException { const MicrochipTakenException({required super.message}) : super(code: ApiCodes.microchipTaken); } /// 40904:同宠物同疫苗同系列同剂次的非 cancelled 疫苗记录已存在 /// (cancel 后同剂次可重新登记)。 final class VaccinationDoseExistsException extends ApiBusinessException { const VaccinationDoseExistsException({required super.message}) : super(code: ApiCodes.vaccinationDoseExists); } /// 42201:疫苗状态机非法迁移或状态-日期规则违反(HTTP 422)。 final class VaccinationRuleException extends ApiBusinessException { const VaccinationRuleException({required super.message}) : super(code: ApiCodes.vaccinationRuleViolation); } /// 42202:提醒状态机非法迁移或 completed-completedAt 一致性违反(HTTP 422)。 final class CareReminderRuleException extends ApiBusinessException { const CareReminderRuleException({required super.message}) : super(code: ApiCodes.careReminderRuleViolation); } /// 把通用业务异常按 pets 域错误码升格为类型化异常; /// 未覆盖的码(40000 参数错误等)原样返回,沿用通用处理。 ApiBusinessException mapPetBusinessException(ApiBusinessException error) { return switch (error.code) { ApiCodes.petAccessDenied => PetAccessDeniedException( message: error.message, ), ApiCodes.petNotFound => PetNotFoundException(message: error.message), ApiCodes.recordNotFound => PetRecordNotFoundException( message: error.message, ), ApiCodes.versionConflict => PetVersionConflictException( message: error.message, ), ApiCodes.microchipTaken => MicrochipTakenException(message: error.message), ApiCodes.vaccinationDoseExists => VaccinationDoseExistsException( message: error.message, ), ApiCodes.vaccinationRuleViolation => VaccinationRuleException( message: error.message, ), ApiCodes.careReminderRuleViolation => CareReminderRuleException( message: error.message, ), _ => error, }; }