Dalam aplikasi semasa saya, saya perlu mencipta laluan api GET "/inactive-users" yang sepatutnya mengembalikan pengguna yang diarkibkan (“isArchived”
),并且同时处于非活动状态超过一个月("lastVisitedDate"
字段应早于 new Date() - 1 个月
).
Menggunakan seni bina berlapis (pengawal/perkhidmatan/repositori) dan model domain yang lemah, apakah yang perlu saya lakukan dalam kes ini?
Saya melihat terdapat dua pendekatan yang mungkin.
1 - Buat kaedah repositori generik untuk mendapatkan pengguna dan menghantarnya ke medan pengguna yang kami perlukan.
@Injectable() export class UserRepository { constructor(private readonly prisma: PrismaService) { } findAll = async ( where: { user: Partial<User>; dateTreshold: Date } ): Promise<User[]> => { const users = await this.prisma.user.findMany( { where: {...user}, lastVisitedDate: { lt: dateTreshold }; // lt - less than ); return users.map(user => new User(user)); } } @Injectable() export class UserService { constructor(private readonly userRepository: UserRepository) {} getInactiveUsers = async () => { return this.userRepository.findAll( { where: {user: {isArchived: true}, dateTreshold: "// calculatedDate //"} ) } }
2 - Buat kaedah repositori untuk mendapatkan semula pengguna yang tidak aktif dengan tepat, kaedah itu akan mengetahui medan mana yang perlu diminta.
@Injectable() export class UserRepository { constructor(private readonly prisma: PrismaService) { } getInactiveUsers = async (): Promise<User[]> => { const users = await this.prisma.user.findMany( { where: {isArchived: false, lastVisitedDate: { lt: "// calculatedDate //" }}; // lt - less than ); return users.map(user => new User(user)); } } @Injectable() export class UserService { constructor(private readonly userRepository: UserRepository) {} getInactiveUsers = async () => { return this.userRepository.getInactiveUsers() } }
Cara mana yang lebih baik? Yang pertama kelihatan baik kepada saya kerana dalam kes ini repositori tidak mengetahui apa-apa tentang pemahaman domain pengguna "tidak aktif". Tetapi pada masa yang sama - membina pendekatan reaktif sedemikian boleh menjadi agak sukar.
Cara kedua adalah lebih mudah untuk dibina, tetapi pada masa yang sama - ia mempunyai pemahaman logik "perniagaan" dan mengetahui bahawa pengguna tidak aktif adalah mereka "isArchived"
等于 false
. Selain itu, kaedah repositori ini mengetahui berapa hari yang perlu kita gunakan.
Pilihan yang manakah harus dipilih dalam situasi ini? Atau mungkin ada cara lain untuk membina benda ini?
Cara yang betul untuk mengasingkan masalah ini ialah repositori hanya mengetahui tentang elemen data dalam repositori. Ini tidak bermakna anda tidak boleh mempunyai berbilang titik masuk ke dalam repositori anda, mungkin terdapat banyak pertanyaan berbeza yang semuanya mengakses "jadual" yang sama.
Ini tidak bermakna anda memerlukan QBE penuh seperti kaedah pertama, pastikan ia mudah. Terdapat pertanyaan yang merangkumi tahap pangkalan data tetapi masih memerlukan apa yang diperlukan.
Dalam kes ini, anda harus mempunyai tandatangan lulus parameter isArchived dan lastVisitedDate. Sesuatu seperti QueryUsersByStatusAndLastVisited. Dengan cara ini repositori mengendalikan semua bit yang terlibat dalam mendapatkan semula data, tetapi tidak mempunyai logik mengapa ia diambil semula. Ia akan menjadi "bodoh", dengan semua bit pintar terkandung dalam lapisan perkhidmatan.