diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 4989400..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,6 +0,0 @@ -# [3.5.0](https://github.com/TogetherCrew/mongo-lib/compare/v3.4.0...v3.5.0) (2025-04-14) - - -### Features - -* add module names ([7fe793c](https://github.com/TogetherCrew/mongo-lib/commit/7fe793c8d1cfae7754d5d73de32d1cde9f3916d0)) diff --git a/README.md b/README.md index 386cb66..093efda 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,6 @@ Note: We have disabled HADOLINT for now as we are getting an error: `qemu: uncau [![Maintainability](https://api.codeclimate.com/v1/badges/52d516c2ad7c262adb37/maintainability)](https://codeclimate.com/github/RnDAO/tc-dbComm/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/52d516c2ad7c262adb37/test_coverage)](https://codeclimate.com/github/RnDAO/tc-dbComm/test_coverage) - ### Tests The CI Pipeline uses the `test` target from the Dockerfile to run the tests. You can run it locally with the following command: @@ -35,7 +34,6 @@ docker compose -f docker-compose.test.yml up --exit-code-from app --build Note: This will create a /coverage folder where you can review the coverage details. - ### User interface ```ts @@ -87,6 +85,7 @@ Module { } } ``` + ### Heatmap interface ```ts @@ -140,7 +139,6 @@ Channel { } ``` - ### Role interface ```ts @@ -212,4 +210,4 @@ Token { expires: Date, blacklisted?: boolean } -``` \ No newline at end of file +``` diff --git a/src/service/connection.ts b/src/connection.ts similarity index 87% rename from src/service/connection.ts rename to src/connection.ts index 80049f8..d2f4f7f 100644 --- a/src/service/connection.ts +++ b/src/connection.ts @@ -1,14 +1,10 @@ -import mongoose, { type Connection } from 'mongoose'; +import mongoose, { Connection } from 'mongoose'; -/** - * Manages the MongoDB connection using Mongoose. - * Implements the singleton pattern to ensure a single connection throughout the application. - */ export default class MongoConnectionManager { private static instance: MongoConnectionManager; private mongoConnection: Connection | null = null; - // Private constructor to prevent direct instantiation + // Private constructorto prevent direct instantiation private constructor() {} public static getInstance(): MongoConnectionManager { diff --git a/src/service/databaseManager.ts b/src/databaseManager.ts similarity index 87% rename from src/service/databaseManager.ts rename to src/databaseManager.ts index 1c5c9d6..031eece 100644 --- a/src/service/databaseManager.ts +++ b/src/databaseManager.ts @@ -1,22 +1,15 @@ -import mongoose, { type Connection } from 'mongoose'; +import { Snowflake } from 'discord.js'; +import mongoose, { Connection } from 'mongoose'; + +import { IChannel, IGuildMember, IHeatMap, IMemberActivity, IRawInfo, IRole } from './interfaces'; import { + channelSchema, + guildMemberSchema, heatMapSchema, - rawInfoSchema, MemberActivitySchema, - guildMemberSchema, - channelSchema, + rawInfoSchema, roleSchema, -} from '../models/schemas'; -import { - type IHeatMap, - type IRawInfo, - type IMemberActivity, - type IGuildMember, - type IChannel, - type IRole, -} from '../interfaces'; - -import { type Snowflake } from 'discord.js'; +} from './models/schemas'; export default class DatabaseManager { private static instance: DatabaseManager; diff --git a/src/index.ts b/src/index.ts index 9bfea2f..0cdb8b8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ export * from './models'; export * from './models/schemas'; export * from './interfaces'; -export * from './service'; export * from './config/enums'; +export * from './databaseManager'; +export * from './connection'; +export * from './repositories'; diff --git a/src/repositories/announcement.repository.ts b/src/repositories/announcement.repository.ts new file mode 100644 index 0000000..d8f56d9 --- /dev/null +++ b/src/repositories/announcement.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IAnnouncement } from '../interfaces'; +import Announcement from '../models/Announcement.model'; + +export class AnnouncementRepository extends BaseRepository { + constructor(model: Model = Announcement) { + super(model); + } +} + +export const announcementRepository = new AnnouncementRepository(); +export default announcementRepository; diff --git a/src/repositories/base.repository.ts b/src/repositories/base.repository.ts new file mode 100644 index 0000000..8cb4c4e --- /dev/null +++ b/src/repositories/base.repository.ts @@ -0,0 +1,58 @@ +// src/db/repositories/base.repository.ts +import { FilterQuery, LeanDocument, Model, PopulateOptions, ProjectionType, QueryOptions, UpdateQuery } from 'mongoose'; + +export interface PaginateOptions { + page?: number; + limit?: number; + sortBy?: string; + populate?: string | PopulateOptions | Array; +} + +export class BaseRepository { + constructor(private readonly model: Model) {} + + async create(doc: Partial): Promise { + return await this.model.create(doc); + } + + async createMany(docs: Array>): Promise { + return await this.model.insertMany(docs); + } + + async findById(id: string, projection?: ProjectionType, options?: QueryOptions): Promise { + return await this.model.findById(id, projection, options); + } + + async find(filter: FilterQuery, projection?: ProjectionType, options?: QueryOptions): Promise { + return await this.model.find(filter, projection, options); + } + + async updateOne( + filter: FilterQuery, + update: UpdateQuery, + options?: QueryOptions, + ): Promise<{ acknowledged: boolean; modifiedCount: number; upsertedId: unknown }> { + return await this.model.updateOne(filter, update, options); + } + + async deleteOne(filter: FilterQuery): Promise<{ deletedCount?: number }> { + return await this.model.deleteOne(filter); + } + + async deleteMany(filter: FilterQuery): Promise<{ deletedCount?: number }> { + return await this.model.deleteMany(filter); + } + + async paginate( + filter: FilterQuery, + options: PaginateOptions, + ): Promise<{ + results: Array>; + page: number; + limit: number; + totalPages: number; + totalResults: number; + }> { + return (this.model as any).paginate(filter, options); + } +} diff --git a/src/repositories/channel.repository.ts b/src/repositories/channel.repository.ts new file mode 100644 index 0000000..7605fb9 --- /dev/null +++ b/src/repositories/channel.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IChannel } from '../interfaces'; +import Channel from '../models/Channel.model'; + +export class ChannelRepository extends BaseRepository { + constructor(model: Model = Channel) { + super(model); + } +} + +export const channelRepository = new ChannelRepository(); +export default channelRepository; diff --git a/src/repositories/community.repository.ts b/src/repositories/community.repository.ts new file mode 100644 index 0000000..32e0039 --- /dev/null +++ b/src/repositories/community.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { ICommunity } from '../interfaces'; +import Community from '../models/Community.model'; + +export class CommunityRepository extends BaseRepository { + constructor(model: Model = Community) { + super(model); + } +} + +export const communityRepository = new CommunityRepository(); +export default communityRepository; diff --git a/src/repositories/guildMember.repository.ts b/src/repositories/guildMember.repository.ts new file mode 100644 index 0000000..f2ab9ba --- /dev/null +++ b/src/repositories/guildMember.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IGuildMember } from '../interfaces'; +import GuildMember from '../models/GuildMember.model'; + +export class GuildMemberRepository extends BaseRepository { + constructor(model: Model = GuildMember) { + super(model); + } +} + +export const guildMemberRepository = new GuildMemberRepository(); +export default guildMemberRepository; diff --git a/src/repositories/heatMap.repository.ts b/src/repositories/heatMap.repository.ts new file mode 100644 index 0000000..a4f8702 --- /dev/null +++ b/src/repositories/heatMap.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IHeatMap } from '../interfaces'; +import HeatMap from '../models/HeatMap.model'; + +export class HeatMapRepository extends BaseRepository { + constructor(model: Model = HeatMap) { + super(model); + } +} + +export const heatMapRepository = new HeatMapRepository(); +export default heatMapRepository; diff --git a/src/repositories/index.ts b/src/repositories/index.ts new file mode 100644 index 0000000..c35ab3d --- /dev/null +++ b/src/repositories/index.ts @@ -0,0 +1,29 @@ +import { BaseRepository } from './base.repository'; +import userRepository from './user.repository'; +import tokenRepository from './token.repository'; +import heatMapRepository from './heatMap.repository'; +import rawInfoRepository from './rawInfo.repository'; +import memberActivityRepository from './memberActivity.repository'; +import guildMemberRepository from './guildMember.repository'; +import channelRepository from './channel.repository'; +import roleRepository from './role.repository'; +import communityRepository from './community.repository'; +import platformRepository from './platform.repository'; +import announcementRepository from './announcement.repository'; +import moduleRepository from './module.repository'; + +export { + BaseRepository, + userRepository, + tokenRepository, + heatMapRepository, + rawInfoRepository, + memberActivityRepository, + guildMemberRepository, + channelRepository, + roleRepository, + communityRepository, + platformRepository, + announcementRepository, + moduleRepository, +}; diff --git a/src/repositories/memberActivity.repository.ts b/src/repositories/memberActivity.repository.ts new file mode 100644 index 0000000..121ef93 --- /dev/null +++ b/src/repositories/memberActivity.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IMemberActivity } from '../interfaces'; +import MemberActivity from '../models/memberActivity.model'; + +export class MemberActivityRepository extends BaseRepository { + constructor(model: Model = MemberActivity) { + super(model); + } +} + +export const memberActivityRepository = new MemberActivityRepository(); +export default memberActivityRepository; diff --git a/src/repositories/module.repository.ts b/src/repositories/module.repository.ts new file mode 100644 index 0000000..6674942 --- /dev/null +++ b/src/repositories/module.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IModule } from '../interfaces'; +import Module from '../models/Module.model'; + +export class ModuleRepository extends BaseRepository { + constructor(model: Model = Module) { + super(model); + } +} + +export const moduleRepository = new ModuleRepository(); +export default moduleRepository; diff --git a/src/repositories/platform.repository.ts b/src/repositories/platform.repository.ts new file mode 100644 index 0000000..556f83a --- /dev/null +++ b/src/repositories/platform.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IPlatform } from '../interfaces'; +import Platform from '../models/Platfrom.model'; + +export class PlatformRepository extends BaseRepository { + constructor(model: Model = Platform) { + super(model); + } +} + +export const platformRepository = new PlatformRepository(); +export default platformRepository; diff --git a/src/repositories/rawInfo.repository.ts b/src/repositories/rawInfo.repository.ts new file mode 100644 index 0000000..be207fe --- /dev/null +++ b/src/repositories/rawInfo.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IRawInfo } from '../interfaces'; +import RawInfo from '../models/RawInfo.model'; + +export class RawInfoRepository extends BaseRepository { + constructor(model: Model = RawInfo) { + super(model); + } +} + +export const rawInfoRepository = new RawInfoRepository(); +export default rawInfoRepository; diff --git a/src/repositories/role.repository.ts b/src/repositories/role.repository.ts new file mode 100644 index 0000000..d40d963 --- /dev/null +++ b/src/repositories/role.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IRole } from '../interfaces'; +import Role from '../models/Role.model'; + +export class RoleRepository extends BaseRepository { + constructor(model: Model = Role) { + super(model); + } +} + +export const roleRepository = new RoleRepository(); +export default roleRepository; diff --git a/src/repositories/token.repository.ts b/src/repositories/token.repository.ts new file mode 100644 index 0000000..e59491a --- /dev/null +++ b/src/repositories/token.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IToken } from '../interfaces'; +import Token from '../models/Token.model'; + +export class TokenRepository extends BaseRepository { + constructor(model: Model = Token) { + super(model); + } +} + +export const tokenRepository = new TokenRepository(); +export default tokenRepository; diff --git a/src/repositories/user.repository.ts b/src/repositories/user.repository.ts new file mode 100644 index 0000000..5c2c2a7 --- /dev/null +++ b/src/repositories/user.repository.ts @@ -0,0 +1,13 @@ +import { Model } from 'mongoose'; +import { BaseRepository } from './base.repository'; +import { IUser } from '../interfaces'; +import User from '../models/User.model'; + +export class UserRepository extends BaseRepository { + constructor(model: Model = User) { + super(model); + } +} + +export const userRepository = new UserRepository(); +export default userRepository; diff --git a/src/service/index.ts b/src/service/index.ts deleted file mode 100644 index f24e8a6..0000000 --- a/src/service/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import DatabaseManager from './databaseManager'; -import Connection from './connection'; -export { DatabaseManager, Connection };