finish all apis
parent
3408f01ad5
commit
41d1a5071b
@ -0,0 +1,18 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { RankController } from './rank.controller';
|
||||
|
||||
describe('RankController', () => {
|
||||
let controller: RankController;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
controllers: [RankController],
|
||||
}).compile();
|
||||
|
||||
controller = module.get<RankController>(RankController);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(controller).toBeDefined();
|
||||
});
|
||||
});
|
@ -0,0 +1,45 @@
|
||||
import { Controller, Get, Param, Post, Req, UseGuards } from '@nestjs/common';
|
||||
import { Request } from 'express';
|
||||
import { JwtAuthGuard } from 'src/auth/jwt-auth.guard';
|
||||
import { Rank } from './rank.model';
|
||||
import { RankService } from './rank.service';
|
||||
|
||||
@Controller('rank')
|
||||
export class RankController {
|
||||
constructor(private rankService: RankService) {}
|
||||
|
||||
@Get()
|
||||
async getRankList(): Promise<Rank[]> {
|
||||
return this.rankService.findRankList();
|
||||
}
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Get('/:id')
|
||||
async getUserRank(@Param('id') userId: string): Promise<Rank> {
|
||||
return this.rankService.findByUserLatest(userId);
|
||||
}
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Get('/:id/all')
|
||||
async getUserHistory(@Param('id') userId: string): Promise<Rank[]> {
|
||||
return this.rankService.findByUser(userId);
|
||||
}
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Post('/add/20')
|
||||
async add20Points(@Req() req): Promise<any> {
|
||||
this.rankService.create(20, req.user.id);
|
||||
}
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Post('/add/60')
|
||||
async add60Points(@Req() req): Promise<void> {
|
||||
this.rankService.create(60, req.user.id);
|
||||
}
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Post('/add/100')
|
||||
async add100Points(@Req() req): Promise<void> {
|
||||
this.rankService.create(100, req.user.id);
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
import { BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Model, NotEmpty, PrimaryKey, Table, UpdatedAt } from "sequelize-typescript";
|
||||
import { User } from "src/user/user.model";
|
||||
|
||||
@Table({
|
||||
timestamps: true,
|
||||
})
|
||||
export class Rank extends Model {
|
||||
@PrimaryKey
|
||||
@Default(DataType.UUIDV4)
|
||||
@Column(DataType.STRING)
|
||||
id: string;
|
||||
|
||||
@NotEmpty
|
||||
@Column
|
||||
points: number;
|
||||
|
||||
@CreatedAt
|
||||
createdAt: Date;
|
||||
|
||||
@UpdatedAt
|
||||
updatedAt: Date;
|
||||
|
||||
@NotEmpty
|
||||
@ForeignKey(() => User)
|
||||
@Column
|
||||
userId: string;
|
||||
|
||||
@BelongsTo(() => User)
|
||||
user: User;
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { RankService } from './rank.service';
|
||||
import { RankController } from './rank.controller';
|
||||
import { SequelizeModule } from '@nestjs/sequelize';
|
||||
import { Rank } from './rank.model';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
SequelizeModule.forFeature([Rank]),
|
||||
],
|
||||
providers: [RankService],
|
||||
controllers: [RankController]
|
||||
})
|
||||
export class RankModule {}
|
@ -0,0 +1,18 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { RankService } from './rank.service';
|
||||
|
||||
describe('RankService', () => {
|
||||
let service: RankService;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
providers: [RankService],
|
||||
}).compile();
|
||||
|
||||
service = module.get<RankService>(RankService);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(service).toBeDefined();
|
||||
});
|
||||
});
|
@ -0,0 +1,69 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectModel } from '@nestjs/sequelize';
|
||||
import { Op } from 'sequelize';
|
||||
import { col, fn } from 'sequelize';
|
||||
import { User } from 'src/user/user.model';
|
||||
import { Rank } from './rank.model';
|
||||
|
||||
@Injectable()
|
||||
export class RankService {
|
||||
constructor(
|
||||
@InjectModel(Rank) private rankModel: typeof Rank
|
||||
) {}
|
||||
|
||||
async create(points, userId): Promise<Rank> {
|
||||
return this.rankModel.create({
|
||||
points,
|
||||
userId
|
||||
});
|
||||
}
|
||||
|
||||
async findAll(): Promise<Rank[]>{
|
||||
return this.rankModel.findAll();
|
||||
}
|
||||
|
||||
async findByUser(userId: string): Promise<Rank[]> {
|
||||
return this.rankModel.findAll({
|
||||
where: {
|
||||
userId,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async findByUserLatest(userId: string): Promise<Rank> {
|
||||
return this.rankModel.findOne({
|
||||
where: {
|
||||
userId,
|
||||
},
|
||||
order: ['createdAt', 'DESC'],
|
||||
});
|
||||
}
|
||||
|
||||
async findRankList(): Promise<Rank[]> {
|
||||
return this.rankModel.findAll({
|
||||
attributes: [
|
||||
'id',
|
||||
[fn('MAX', col('createdAt')), 'mDate'],
|
||||
'userId',
|
||||
],
|
||||
group: ['userId'],
|
||||
}).then((res) => {
|
||||
const maxIds = [];
|
||||
res.forEach(r => {
|
||||
maxIds.push(r.id);
|
||||
});
|
||||
return this.rankModel.findAll({
|
||||
attributes: ['id', 'points'],
|
||||
where: {
|
||||
id: {
|
||||
[Op.in]: maxIds
|
||||
},
|
||||
},
|
||||
include: [{
|
||||
model: User,
|
||||
attributes: ['name'],
|
||||
}],
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue