## 后端改动 - 添加 Project.envPresets 字段(JSON 格式) - 移除 Deployment.env 字段,统一使用 envVars - 更新部署 DTO,支持 envVars (Record<string, string>) - pipeline-runner 支持解析并注入 envVars 到环境 - 移除稀疏检出模板和相关环境变量 - 优化代码格式(Biome lint & format) ## 前端改动 - 新增 EnvPresetsEditor 组件(支持单选/多选/输入框类型) - 项目创建/编辑界面集成环境预设编辑器 - 部署界面基于预设动态生成环境变量表单 - 移除稀疏检出表单项 - 项目详情页添加环境变量预设配置 tab - 优化部署界面布局(基本参数 & 环境变量分区) ## 文档 - 添加完整文档目录结构(docs/) - 创建设计文档 design-0005(部署流程重构) - 添加 API 文档、架构设计文档等 ## 数据库 - 执行 prisma db push 同步 schema 变更
85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
import type { Context } from 'koa';
|
|
import { Controller, Get, Post } from '../../decorators/route.ts';
|
|
import { gitea } from '../../libs/gitea.ts';
|
|
import { log } from '../../libs/logger.ts';
|
|
import { prisma } from '../../libs/prisma.ts';
|
|
import { loginSchema } from './dto.ts';
|
|
|
|
@Controller('/auth')
|
|
export class AuthController {
|
|
private readonly TAG = 'Auth';
|
|
|
|
@Get('/url')
|
|
async url() {
|
|
return {
|
|
url: `${process.env.GITEA_URL}/login/oauth/authorize?client_id=${process.env.GITEA_CLIENT_ID}&redirect_uri=${process.env.GITEA_REDIRECT_URI}&response_type=code&state=STATE`,
|
|
};
|
|
}
|
|
|
|
@Post('/login')
|
|
async login(ctx: Context) {
|
|
if (ctx.session.user) {
|
|
return ctx.session.user;
|
|
}
|
|
const { code } = loginSchema.parse(ctx.request.body);
|
|
const { access_token, refresh_token, expires_in } =
|
|
await gitea.getToken(code);
|
|
const giteaAuth = {
|
|
access_token,
|
|
refresh_token,
|
|
expires_at: Date.now() + expires_in * 1000,
|
|
};
|
|
const giteaUser = await gitea.getUserInfo(access_token);
|
|
log.debug(this.TAG, 'gitea user: %o', giteaUser);
|
|
const exist = await prisma.user.findFirst({
|
|
where: {
|
|
login: giteaUser.login,
|
|
email: giteaUser.email,
|
|
},
|
|
});
|
|
if (exist == null) {
|
|
const createdUser = await prisma.user.create({
|
|
data: {
|
|
id: giteaUser.id,
|
|
login: giteaUser.login,
|
|
email: giteaUser.email,
|
|
username: giteaUser.username,
|
|
avatar_url: giteaUser.avatar_url,
|
|
active: giteaUser.active,
|
|
createdAt: giteaUser.created,
|
|
},
|
|
});
|
|
log.debug(this.TAG, '新建用户成功 %o', createdUser);
|
|
ctx.session.user = createdUser;
|
|
} else {
|
|
const updatedUser = await prisma.user.update({
|
|
where: {
|
|
id: exist.id,
|
|
},
|
|
data: {
|
|
login: giteaUser.login,
|
|
email: giteaUser.email,
|
|
username: giteaUser.username,
|
|
avatar_url: giteaUser.avatar_url,
|
|
active: giteaUser.active,
|
|
createdAt: giteaUser.created,
|
|
},
|
|
});
|
|
log.debug(this.TAG, '更新用户信息成功 %o', updatedUser);
|
|
ctx.session.user = updatedUser;
|
|
}
|
|
ctx.session.gitea = giteaAuth;
|
|
return ctx.session.user;
|
|
}
|
|
|
|
@Get('logout')
|
|
async logout(ctx: Context) {
|
|
ctx.session.user = null;
|
|
}
|
|
|
|
@Get('info')
|
|
async info(ctx: Context) {
|
|
return ctx.session?.user;
|
|
}
|
|
}
|