Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
package common
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/perfect-panel/server/internal/svc"
|
|
"github.com/perfect-panel/server/internal/types"
|
|
"github.com/perfect-panel/server/pkg/logger"
|
|
)
|
|
|
|
type GetDownloadLinkLogic struct {
|
|
logger.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
// NewGetDownloadLinkLogic 获取下载链接
|
|
func NewGetDownloadLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDownloadLinkLogic {
|
|
return &GetDownloadLinkLogic{
|
|
Logger: logger.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
// GetDownloadLink 根据邀请码和平台动态生成下载链接
|
|
// 生成的链接格式: https://{host}/v1/common/client/download/file/{platform}-{version}-ic_{invite_code}.{ext}
|
|
// Nginx 会拦截此请求,将其映射到实际文件,并在 Content-Disposition 中设置带邀请码的文件名
|
|
func (l *GetDownloadLinkLogic) GetDownloadLink(req *types.GetDownloadLinkRequest) (resp *types.GetDownloadLinkResponse, err error) {
|
|
// 1. 获取站点域名 (数据库配置通常会覆盖文件配置)
|
|
host := l.svcCtx.Config.Site.Host
|
|
if host == "" {
|
|
// 保底域名
|
|
host = "tapi.airoport.co"
|
|
}
|
|
|
|
// 2. 版本号 (后续可以从数据库或配置中读取)
|
|
version := "1.0.0"
|
|
|
|
// 3. 根据平台确定文件扩展名
|
|
var ext string
|
|
switch req.Platform {
|
|
case "windows":
|
|
ext = ".exe"
|
|
case "mac":
|
|
ext = ".dmg"
|
|
case "android":
|
|
ext = ".apk"
|
|
case "ios":
|
|
ext = ".ipa"
|
|
default:
|
|
ext = ".bin"
|
|
}
|
|
|
|
// 4. 构建文件名: 平台-版本号-ic_邀请码.扩展名
|
|
filename := fmt.Sprintf("%s-%s-ic_%s%s", req.Platform, version, req.InviteCode, ext)
|
|
|
|
// 5. 构建完整 URL (Nginx 会拦截此路径进行虚拟更名处理)
|
|
url := fmt.Sprintf("https://%s/v1/common/client/download/file/%s", host, filename)
|
|
|
|
return &types.GetDownloadLinkResponse{
|
|
Url: url,
|
|
}, nil
|
|
}
|