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