|
|
@@ -0,0 +1,54 @@
|
|
|
+import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
|
|
+import { WeChatService } from 'nest-wechat';
|
|
|
+import { UserBindService } from '../../core/service/user-bind.service';
|
|
|
+import { InjectRepository } from '@nestjs/typeorm';
|
|
|
+import { MiniProgramUser } from '../entity/mini-program-user.entity';
|
|
|
+import { Repository } from 'typeorm';
|
|
|
+import { UserService } from '../../core/service/user.service';
|
|
|
+import { CreateUserRequest } from '../../core/dto/create-user.request';
|
|
|
+import { AuthService } from '../../core/service/auth.service';
|
|
|
+
|
|
|
+@Injectable()
|
|
|
+export class MiniProgramService {
|
|
|
+ constructor(
|
|
|
+ @InjectRepository(MiniProgramUser)
|
|
|
+ private readonly miniProgramUserRepository: Repository<MiniProgramUser>,
|
|
|
+ private readonly weChatService: WeChatService,
|
|
|
+ private readonly userBindService: UserBindService,
|
|
|
+ private readonly userService: UserService,
|
|
|
+ private readonly authService: AuthService,
|
|
|
+ ) {}
|
|
|
+
|
|
|
+ async createTokenByCode(code: string) {
|
|
|
+ const sessionResult = await this.weChatService.mp.code2Session(code);
|
|
|
+
|
|
|
+ if (!sessionResult || !sessionResult.openid) {
|
|
|
+ throw new HttpException('Invalid WeChat code', HttpStatus.BAD_REQUEST);
|
|
|
+ }
|
|
|
+
|
|
|
+ const { openid } = sessionResult;
|
|
|
+ let miniProgramUser = await this.miniProgramUserRepository.findOneBy({
|
|
|
+ openId: openid,
|
|
|
+ });
|
|
|
+
|
|
|
+ if (miniProgramUser) {
|
|
|
+ const userBind = await this.userBindService.findByTypeAndBindId(
|
|
|
+ 'mini-program',
|
|
|
+ miniProgramUser.id,
|
|
|
+ );
|
|
|
+ return this.authService.generateToken(userBind.user);
|
|
|
+ }
|
|
|
+
|
|
|
+ miniProgramUser = this.miniProgramUserRepository.create({
|
|
|
+ openId: openid,
|
|
|
+ });
|
|
|
+ await this.miniProgramUserRepository.save(miniProgramUser);
|
|
|
+ const createUserRequest = new CreateUserRequest();
|
|
|
+ // 随机username
|
|
|
+ createUserRequest.username = `mini-program-${Math.random()}`;
|
|
|
+ createUserRequest.password = `mini-program-${Math.random()}`;
|
|
|
+ const user = await this.userService.create(createUserRequest);
|
|
|
+ await this.userBindService.create(user, 'mini-program', miniProgramUser.id);
|
|
|
+ return this.authService.generateToken(user);
|
|
|
+ }
|
|
|
+}
|