feat: redesign crypto market with synced favorites

This commit is contained in:
hajimi
2026-08-02 02:32:20 +08:00
parent b5b59d7bf1
commit cd054d4db6
9 changed files with 1078 additions and 210 deletions
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace app\api\logic;
use app\common\enum\YesNoEnum;
use app\common\logic\BaseLogic;
use app\common\model\crypto\CryptoFavorite;
use app\common\service\crypto\CryptoMarketService;
class CryptoLogic extends BaseLogic
{
public static function market(): array
{
return CryptoMarketService::snapshot();
}
public static function favorites(int $userId): array
{
$symbols = CryptoFavorite::where([
'user_id' => $userId,
'status' => YesNoEnum::YES,
])->order('create_time asc')->column('symbol');
return array_values(array_unique(array_map('strtoupper', $symbols)));
}
public static function addFavorite(int $userId, string $symbol): bool
{
$symbol = strtoupper(trim($symbol));
if (!CryptoMarketService::isSupportedSymbol($symbol)) {
self::setError('暂不支持该币种');
return false;
}
try {
$where = ['user_id' => $userId, 'symbol' => $symbol];
$favorite = CryptoFavorite::where($where)->findOrEmpty();
if ($favorite->isEmpty()) {
try {
CryptoFavorite::create($where + ['status' => YesNoEnum::YES]);
} catch (\Throwable $e) {
CryptoFavorite::update(['status' => YesNoEnum::YES], $where);
}
} else {
$favorite->status = YesNoEnum::YES;
$favorite->save();
}
return true;
} catch (\Throwable $e) {
self::setError('收藏失败,请稍后重试');
return false;
}
}
public static function cancelFavorite(int $userId, string $symbol): bool
{
try {
CryptoFavorite::update(
['status' => YesNoEnum::NO],
['user_id' => $userId, 'symbol' => strtoupper(trim($symbol))]
);
return true;
} catch (\Throwable $e) {
self::setError('取消收藏失败,请稍后重试');
return false;
}
}
}