-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
enhance: 人気のPlayを10件以上表示できるように (#14443)
Co-authored-by: osamu <[email protected]>
- Loading branch information
1 parent
d8bf1ff
commit 0d7d109
Showing
12 changed files
with
262 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* | ||
* SPDX-FileCopyrightText: syuilo and misskey-project | ||
* SPDX-License-Identifier: AGPL-3.0-only | ||
*/ | ||
|
||
import { Inject, Injectable } from '@nestjs/common'; | ||
import { DI } from '@/di-symbols.js'; | ||
import { type FlashsRepository } from '@/models/_.js'; | ||
|
||
/** | ||
* MisskeyPlay関係のService | ||
*/ | ||
@Injectable() | ||
export class FlashService { | ||
constructor( | ||
@Inject(DI.flashsRepository) | ||
private flashRepository: FlashsRepository, | ||
) { | ||
} | ||
|
||
/** | ||
* 人気のあるPlay一覧を取得する. | ||
*/ | ||
public async featured(opts?: { offset?: number, limit: number }) { | ||
const builder = this.flashRepository.createQueryBuilder('flash') | ||
.andWhere('flash.likedCount > 0') | ||
.andWhere('flash.visibility = :visibility', { visibility: 'public' }) | ||
.addOrderBy('flash.likedCount', 'DESC') | ||
.addOrderBy('flash.updatedAt', 'DESC') | ||
.addOrderBy('flash.id', 'DESC'); | ||
|
||
if (opts?.offset) { | ||
builder.skip(opts.offset); | ||
} | ||
|
||
builder.take(opts?.limit ?? 10); | ||
|
||
return await builder.getMany(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
/* eslint-disable @typescript-eslint/no-unused-vars */ | ||
/* | ||
* SPDX-FileCopyrightText: syuilo and misskey-project | ||
* SPDX-License-Identifier: AGPL-3.0-only | ||
*/ | ||
|
||
import { Test, TestingModule } from '@nestjs/testing'; | ||
import { FlashService } from '@/core/FlashService.js'; | ||
import { IdService } from '@/core/IdService.js'; | ||
import { FlashsRepository, MiFlash, MiUser, UserProfilesRepository, UsersRepository } from '@/models/_.js'; | ||
import { DI } from '@/di-symbols.js'; | ||
import { GlobalModule } from '@/GlobalModule.js'; | ||
|
||
describe('FlashService', () => { | ||
let app: TestingModule; | ||
let service: FlashService; | ||
|
||
// -------------------------------------------------------------------------------------- | ||
|
||
let flashsRepository: FlashsRepository; | ||
let usersRepository: UsersRepository; | ||
let userProfilesRepository: UserProfilesRepository; | ||
let idService: IdService; | ||
|
||
// -------------------------------------------------------------------------------------- | ||
|
||
let root: MiUser; | ||
let alice: MiUser; | ||
let bob: MiUser; | ||
|
||
// -------------------------------------------------------------------------------------- | ||
|
||
async function createFlash(data: Partial<MiFlash>) { | ||
return flashsRepository.insert({ | ||
id: idService.gen(), | ||
updatedAt: new Date(), | ||
userId: root.id, | ||
title: 'title', | ||
summary: 'summary', | ||
script: 'script', | ||
permissions: [], | ||
likedCount: 0, | ||
...data, | ||
}).then(x => flashsRepository.findOneByOrFail(x.identifiers[0])); | ||
} | ||
|
||
async function createUser(data: Partial<MiUser> = {}) { | ||
const user = await usersRepository | ||
.insert({ | ||
id: idService.gen(), | ||
...data, | ||
}) | ||
.then(x => usersRepository.findOneByOrFail(x.identifiers[0])); | ||
|
||
await userProfilesRepository.insert({ | ||
userId: user.id, | ||
}); | ||
|
||
return user; | ||
} | ||
|
||
// -------------------------------------------------------------------------------------- | ||
|
||
beforeEach(async () => { | ||
app = await Test.createTestingModule({ | ||
imports: [ | ||
GlobalModule, | ||
], | ||
providers: [ | ||
FlashService, | ||
IdService, | ||
], | ||
}).compile(); | ||
|
||
service = app.get(FlashService); | ||
|
||
flashsRepository = app.get(DI.flashsRepository); | ||
usersRepository = app.get(DI.usersRepository); | ||
userProfilesRepository = app.get(DI.userProfilesRepository); | ||
idService = app.get(IdService); | ||
|
||
root = await createUser({ username: 'root', usernameLower: 'root', isRoot: true }); | ||
alice = await createUser({ username: 'alice', usernameLower: 'alice', isRoot: false }); | ||
bob = await createUser({ username: 'bob', usernameLower: 'bob', isRoot: false }); | ||
}); | ||
|
||
afterEach(async () => { | ||
await usersRepository.delete({}); | ||
await userProfilesRepository.delete({}); | ||
await flashsRepository.delete({}); | ||
}); | ||
|
||
afterAll(async () => { | ||
await app.close(); | ||
}); | ||
|
||
// -------------------------------------------------------------------------------------- | ||
|
||
describe('featured', () => { | ||
test('should return featured flashes', async () => { | ||
const flash1 = await createFlash({ likedCount: 1 }); | ||
const flash2 = await createFlash({ likedCount: 2 }); | ||
const flash3 = await createFlash({ likedCount: 3 }); | ||
|
||
const result = await service.featured({ | ||
offset: 0, | ||
limit: 10, | ||
}); | ||
|
||
expect(result).toEqual([flash3, flash2, flash1]); | ||
}); | ||
|
||
test('should return featured flashes public visibility only', async () => { | ||
const flash1 = await createFlash({ likedCount: 1, visibility: 'public' }); | ||
const flash2 = await createFlash({ likedCount: 2, visibility: 'public' }); | ||
const flash3 = await createFlash({ likedCount: 3, visibility: 'private' }); | ||
|
||
const result = await service.featured({ | ||
offset: 0, | ||
limit: 10, | ||
}); | ||
|
||
expect(result).toEqual([flash2, flash1]); | ||
}); | ||
|
||
test('should return featured flashes with offset', async () => { | ||
const flash1 = await createFlash({ likedCount: 1 }); | ||
const flash2 = await createFlash({ likedCount: 2 }); | ||
const flash3 = await createFlash({ likedCount: 3 }); | ||
|
||
const result = await service.featured({ | ||
offset: 1, | ||
limit: 10, | ||
}); | ||
|
||
expect(result).toEqual([flash2, flash1]); | ||
}); | ||
|
||
test('should return featured flashes with limit', async () => { | ||
const flash1 = await createFlash({ likedCount: 1 }); | ||
const flash2 = await createFlash({ likedCount: 2 }); | ||
const flash3 = await createFlash({ likedCount: 3 }); | ||
|
||
const result = await service.featured({ | ||
offset: 0, | ||
limit: 2, | ||
}); | ||
|
||
expect(result).toEqual([flash3, flash2]); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.