diff --git a/src/config/index.ts b/src/config/index.ts index 3915b1dd..249534ab 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -56,10 +56,8 @@ const envVarsSchema = Joi.object() REDIS_HOST: Joi.string().required().description('Redis host'), REDIS_PORT: Joi.string().required().description('Redis port'), REDIS_PASSWORD: Joi.string().required().description('Reids password').allow(''), - OCI_BACKEND_URL: Joi.string().required().description('Oci Backend url'), TEMPORAL_URI: Joi.string().required().description('Temporal address'), TEMPORAL_QUEUE_HEAVY: Joi.string().required().description('Queue for heavy workflows'), - BLOCKCHAIN_NETWORK_MODE: Joi.string().valid('mainnet', 'testnet').required(), }) .unknown(); @@ -166,6 +164,4 @@ export default { uri: envVars.TEMPORAL_URI, heavyQueue: envVars.TEMPORAL_QUEUE_HEAVY, }, - ociBackendURL: envVars.OCI_BACKEND_URL, - blockchainNetworkMode: envVars.BLOCKCHAIN_NETWORK_MODE, }; diff --git a/src/controllers/index.ts b/src/controllers/index.ts index 56d55d69..9b01c8ce 100644 --- a/src/controllers/index.ts +++ b/src/controllers/index.ts @@ -1,16 +1,15 @@ +import announcementController from './announcement.controller'; import authController from './auth.controller'; -import userController from './user.controller'; +import categoryController from './category.controller'; +import communityController from './community.controller'; +import discourseController from './discourse.controller'; import heatmapController from './heatmap.controller'; -import notionController from './notion.controller'; import memberActivityController from './memberActivity.controller'; -import communityController from './community.controller'; -import platformController from './platform.controller'; -import announcementController from './announcement.controller'; -import categoryController from './category.controller'; import moduleController from './module.controller'; -import discourseController from './discourse.controller'; -import nftController from './nft.controller'; +import notionController from './notion.controller'; +import platformController from './platform.controller'; import telegramController from './telegram.controller'; +import userController from './user.controller'; export { authController, @@ -24,6 +23,5 @@ export { categoryController, moduleController, discourseController, - nftController, telegramController, }; diff --git a/src/controllers/nft.controller.ts b/src/controllers/nft.controller.ts deleted file mode 100644 index 47197fee..00000000 --- a/src/controllers/nft.controller.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Request, Response } from 'express'; -import { catchAsync } from '../utils'; -import parentLogger from '../config/logger'; -import { nftService } from '../services'; - -const logger = parentLogger.child({ module: 'NftController' }); - -const getReputationScore = catchAsync(async function (req: Request, res: Response) { - const { tokenId, address } = req.params; - logger.debug(tokenId, address); - const reputationScore = await nftService.getReputationScore(tokenId, address); - res.send(reputationScore); -}); - -export default { - getReputationScore, -}; diff --git a/src/controllers/platform.controller.ts b/src/controllers/platform.controller.ts index 512af1de..15ba5fdc 100644 --- a/src/controllers/platform.controller.ts +++ b/src/controllers/platform.controller.ts @@ -20,7 +20,7 @@ import { twitterService, userService, } from '../services'; -import { ApiError, catchAsync, pick } from '../utils'; +import { catchAsync, pick } from '../utils'; const logger = parentLogger.child({ module: 'PlatformController' }); @@ -323,7 +323,7 @@ const getPlatform = catchAsync(async function (req: IAuthRequest, res: Response) res.send(platform); }); const updatePlatform = catchAsync(async function (req: IAuthAndPlatform, res: Response) { - validatePlatformUpdate(req.platform, req.body); + platformService.validatePlatformUpdate(req.platform, req.body); if (req.platform.name === PlatformNames.Discord) { const discordIdentity = userService.getIdentityByProvider(req.user.identities, PlatformNames.Discord); if (discordIdentity) { @@ -384,23 +384,11 @@ const requestAccess = catchAsync(async function (req: ISessionRequest, res: Resp res.redirect(discordUrl); } }); -const validatePlatformUpdate = (platform: IAuthAndPlatform['platform'], body: IAuthAndPlatform['body']) => { - if (platform.name !== PlatformNames.Discord) return; - if (platform.metadata?.isInProgress && (body.metadata?.selectedChannels || body.metadata?.period)) { - throw new ApiError( - httpStatus.BAD_REQUEST, - 'Updating channels or date period is not allowed during server analysis.', - ); - } - - if (platform.metadata?.isFetchingInitialData && (body.metadata?.selectedChannels || body.metadata?.period)) { - throw new ApiError( - httpStatus.BAD_REQUEST, - 'Updating channels or date periods is not allowed during the initial fetching of the server.', - ); - } -}; +const getReputationScore = catchAsync(async function (req: IAuthAndPlatform, res: Response) { + const reputationScore = await platformService.getReputationScore(req.platform, req.user.id); + res.send(reputationScore); +}); export default { createPlatform, @@ -417,4 +405,5 @@ export default { getProperties, requestAccess, requestAccessCallback, + getReputationScore, }; diff --git a/src/docs/nft.yml b/src/docs/nft.yml deleted file mode 100644 index 4cde1376..00000000 --- a/src/docs/nft.yml +++ /dev/null @@ -1,39 +0,0 @@ -paths: - /api/v1/nft/{tokenId}/{address}/reputation-score: - get: - tags: - - Nft - summary: Retrieve reputation scores for given tokenId and address. - security: - - bearerAuth: [] - parameters: - - name: tokenId - in: path - required: true - description: The token Id which dynamic Nft module is assocated with. - schema: - type: string - - name: address - in: path - required: true - description: The user public address. - schema: - type: string - responses: - '200': - description: Module details retrieved successfully. - content: - application/json: - schema: - type: object - properties: - reputationScore: - type: string - communintyId: - type: string - '400': - description: Bad Request - $ref: '#/components/responses/BadRequest' - '404': - description: NotFound - $ref: '#/components/responses/NotFound' diff --git a/src/docs/platform.doc.yml b/src/docs/platform.doc.yml index 3921810c..82264c58 100644 --- a/src/docs/platform.doc.yml +++ b/src/docs/platform.doc.yml @@ -448,7 +448,7 @@ paths: description: Array of channel IDs (required if 'property' is 'channel'). responses: '200': - description: Platformx properties retrieved successfully. + description: Platform properties retrieved successfully. content: application/json: schema: @@ -559,3 +559,38 @@ paths: '302': description: Found - Redirect to Discord OAuth2 page if conditions are met. $ref: '#/components/responses/Found' + /api/v1/platforms/{platformId}/reputation-score: + get: + tags: + - Platform + summary: Retrieve reputation scores for given platformId. + security: + - bearerAuth: [] + parameters: + - name: platformId + in: path + required: true + description: The ID of the platform + schema: + type: string + format: objectId + responses: + '200': + description: Platform created successfully. + content: + application/json: + schema: + type: object + properties: + reputationScore: + type: integer + example: 1 + '400': + description: Bad Request + $ref: '#/components/responses/BadRequest' + '401': + description: Unauthorized + $ref: '#/components/responses/Unauthorized' + '404': + description: NotFound + $ref: '#/components/responses/NotFound' diff --git a/src/interfaces/Request.interface.ts b/src/interfaces/Request.interface.ts index ad5883db..5ce870d6 100644 --- a/src/interfaces/Request.interface.ts +++ b/src/interfaces/Request.interface.ts @@ -1,7 +1,8 @@ -import { IPlatform, IUser } from '@togethercrew.dev/db'; -import { HydratedDocument } from 'mongoose'; import { Request } from 'express'; import { Session, SessionData } from 'express-session'; +import { HydratedDocument } from 'mongoose'; + +import { IPlatform, IUser } from '@togethercrew.dev/db'; export interface IAuthRequest extends Request { user: HydratedDocument; diff --git a/src/middlewares/auth.ts b/src/middlewares/auth.ts index feb0ce5f..b51c27a6 100644 --- a/src/middlewares/auth.ts +++ b/src/middlewares/auth.ts @@ -1,10 +1,11 @@ -import passport, { use } from 'passport'; +import { NextFunction, Request, Response } from 'express'; import httpStatus from 'http-status'; -import { ApiError, roleUtil, pick } from '../utils'; -import { Request, Response, NextFunction } from 'express'; -import { communityService, platformService, moduleService } from '../services'; import { Types } from 'mongoose'; +import passport from 'passport'; + import { UserRole } from '../interfaces'; +import { communityService, moduleService, platformService } from '../services'; +import { ApiError, pick, roleUtil } from '../utils'; const verifyCallback = (req: Request, resolve: Function, reject: Function, requiredRights: any) => diff --git a/src/routes/v1/index.ts b/src/routes/v1/index.ts index 64a52dc9..72cfdcf6 100644 --- a/src/routes/v1/index.ts +++ b/src/routes/v1/index.ts @@ -1,18 +1,19 @@ import express from 'express'; -import docsRoute from './docs.route'; + +import announcementRoute from './announcement.route'; import authRoute from './auth.route'; -import userRoute from './user.route'; +import categoryRoute from './category.route'; +import communityRoute from './community.route'; +import discourseRoute from './discourse.route'; +import docsRoute from './docs.route'; import heatmapRoute from './heatmap.route'; -import notionRoute from './notion.route'; import memberActivityRoute from './memberActivity.route'; -import communityRoute from './community.route'; -import platformRoute from './platform.route'; -import announcementRoute from './announcement.route'; -import categoryRoute from './category.route'; import moduleRoute from './module.route'; -import discourseRoute from './discourse.route'; -import nftRoute from './nft.route'; +import notionRoute from './notion.route'; +import platformRoute from './platform.route'; import telegramRoute from './telegram.route'; +import userRoute from './user.route'; + const router = express.Router(); const defaultRoutes = [ @@ -65,10 +66,6 @@ const defaultRoutes = [ path: '/discourse', route: discourseRoute, }, - { - path: '/nft', - route: nftRoute, - }, { path: '/telegram', route: telegramRoute, diff --git a/src/routes/v1/nft.route.ts b/src/routes/v1/nft.route.ts deleted file mode 100644 index 7fc008b0..00000000 --- a/src/routes/v1/nft.route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import express from 'express'; -import { nftController } from '../../controllers'; -import { nftValidation } from '../../validations'; -import { validate } from '../../middlewares'; -const router = express.Router(); - -// Routes -router.get( - '/:tokenId/:address/reputation-score', - validate(nftValidation.getReputationScore), - nftController.getReputationScore, -); - -export default router; diff --git a/src/routes/v1/platform.route.ts b/src/routes/v1/platform.route.ts index e186d205..b84bbc5e 100644 --- a/src/routes/v1/platform.route.ts +++ b/src/routes/v1/platform.route.ts @@ -1,8 +1,9 @@ import express from 'express'; + import { platformController } from '../../controllers'; +import { auth, validate } from '../../middlewares'; import { platformValidation } from '../../validations'; -import { auth, validate } from '../../middlewares'; const router = express.Router(); // Routes @@ -39,4 +40,11 @@ router .patch(auth('admin'), validate(platformValidation.dynamicUpdatePlatform), platformController.updatePlatform) .delete(auth('admin'), validate(platformValidation.deletePlatform), platformController.deletePlatform); +router.get( + '/:platformId/reputation-score', + auth('admin', 'view'), + validate(platformValidation.getReputationScore), + platformController.getReputationScore, +); + export default router; diff --git a/src/services/index.ts b/src/services/index.ts index c7eb9dc7..5c514d0f 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,22 +1,22 @@ -import userService from './user.service'; +import announcementService from './announcement.service'; import authService from './auth.service'; -import tokenService from './token.service'; -import heatmapService from './heatmap.service'; -import memberActivityService from './memberActivity.service'; -import sagaService from './saga.service'; import communityService from './community.service'; -import platformService from './platform.service'; -import twitterService from './twitter.service'; import discordServices from './discord'; -import announcementService from './announcement.service'; -import moduleService from './module.service'; -import googleService from './google'; +import discourseService from './discourse'; import githubService from './github'; +import googleService from './google'; +import heatmapService from './heatmap.service'; +import memberActivityService from './memberActivity.service'; +import moduleService from './module.service'; import notionService from './notion'; -import discourseService from './discourse'; -import ociService from './oci.service'; -import nftService from './nft.service'; +import platformService from './platform.service'; +import reputationScoreService from './reputationScore.service'; +import sagaService from './saga.service'; import telegramService from './telegram'; +import tokenService from './token.service'; +import twitterService from './twitter.service'; +import userService from './user.service'; + export { userService, authService, @@ -34,7 +34,6 @@ export { githubService, notionService, discourseService, - ociService, - nftService, telegramService, + reputationScoreService, }; diff --git a/src/services/nft.service.ts b/src/services/nft.service.ts deleted file mode 100644 index 530737f0..00000000 --- a/src/services/nft.service.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { HydratedDocument, Types } from 'mongoose'; -import httpStatus from 'http-status'; -import { IPlatform, IModule, PlatformNames, ICommunity } from '@togethercrew.dev/db'; -import ApiError from '../utils/ApiError'; -import * as Neo4j from '../neo4j'; -import { NEO4J_PLATFORM_INFO } from '../constants/neo4j.constant'; -import { SupportedNeo4jPlatforms } from '../types/neo4j.type'; -import parentLogger from '../config/logger'; -import moduleService from './module.service'; -import platformService from './platform.service'; -import ociService from './oci.service'; -import communityService from './community.service'; -import { MAINNET_CHAIN_IDS, TESTNET_CHAIN_IDS } from '../constants/chains.constant'; -import config from '../config'; - -const logger = parentLogger.child({ module: 'NftService' }); - -const supportedPlatforms = [PlatformNames.Discord, PlatformNames.Discourse]; - -/** - * get reputation score - * @param {IPlatform} PlatformBody - * @returns {Promise>} - */ -const getReputationScore = async (tokenId: string, address: string) => { - const dynamicNftModule = await moduleService.getModuleByFilter({ 'options.platforms.0.metadata.tokenId': tokenId }); - logger.debug(dynamicNftModule); - throwErrorIfDynamicNftModuleDoesNotExist(dynamicNftModule); - - const community = await communityService.getCommunityByFilter({ _id: dynamicNftModule?.community }); - logger.debug(community); - throwErrorIfCommunityDoesNotExist(community); - - const profiles: Array = await getProfiles(address); - logger.debug(profiles); - throwErrorIfUserHasNoOnChainProfiles(profiles); - - let reputationScore = 0; - for (const profile of profiles) { - if (supportedPlatforms.includes(profile.profile.provider)) { - const platform = await platformService.getPlatformByFilter({ - name: profile.profile.provider, - community: dynamicNftModule?.community, - }); - if (platform) { - reputationScore = (await calculateReputationScoreForProfile(profile, platform)) + reputationScore; - logger.debug(`Reputation Score: ${reputationScore}`); - } - } - } - return { - reputationScore: reputationScore * 100, - communityName: community?.name, - }; -}; - -async function getProfiles(address: string) { - let profiles: Array = []; - const supportedChainIds = config.blockchainNetworkMode === 'mainnet' ? MAINNET_CHAIN_IDS : TESTNET_CHAIN_IDS; - for (const chainId of supportedChainIds) { - const chainProfiles = await ociService.getProfiles(address, chainId); - profiles = profiles.concat(chainProfiles); - } - return profiles; -} - -async function calculateReputationScoreForProfile(profile: any, platform: any): Promise { - const platformName = platform.name as SupportedNeo4jPlatforms; - const memberLabel = NEO4J_PLATFORM_INFO[platformName].member; - const platformId = platform.id; - const profileId = profile.profile.id; - - const reputationScoreQuery = buildReputationScoreQuery(profileId, platformId, memberLabel); - const neo4jData = await Neo4j.read(reputationScoreQuery); - - return extractReputationScoreFromNeo4jData(neo4jData); -} - -function buildReputationScoreQuery(profileId: string, platformId: string, memberLabel: string): string { - return ` - MATCH (:${memberLabel} {id: "${profileId}"})-[r:HAVE_METRICS {platformId: "${platformId}"}]->(a) - WITH r.date as metrics_date, r.closenessCentrality as memberScore - ORDER BY metrics_date DESC - LIMIT 1 - MATCH (user:${memberLabel})-[user_r:HAVE_METRICS {platformId: "${platformId}", date: metrics_date}]->(user) - WITH memberScore, MAX(user_r.closenessCentrality) as maxScore - RETURN memberScore / maxScore AS reputation_score - `; -} - -function extractReputationScoreFromNeo4jData(neo4jData: any): number { - const { records } = neo4jData; - logger.debug(`Neo4j Records: ${JSON.stringify(records)}`); - - if (records.length === 0) { - return 0; - } - - const reputationScoreResponse = records[0]; - const reputationScore = reputationScoreResponse.get('reputation_score'); - - return reputationScore || 0; -} - -function throwErrorIfUserHasNoOnChainProfiles(profiles: Array) { - if (profiles.length === 0) { - throw new ApiError(400, 'User does not have any on-chain profiles.'); - } -} - -function throwErrorIfDynamicNftModuleDoesNotExist(dynamicNftModule: HydratedDocument | null) { - if (!dynamicNftModule) { - throw new ApiError(400, 'There is no associated dynamic NFT module for the provided token ID.'); - } -} - -function throwErrorIfCommunityDoesNotExist(community: HydratedDocument | null) { - if (!community) { - throw new ApiError(400, 'There is no associated community for the dynamic NFT module.'); - } -} -export default { - getReputationScore, -}; diff --git a/src/services/oci.service.ts b/src/services/oci.service.ts deleted file mode 100644 index 2664a534..00000000 --- a/src/services/oci.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import fetch from 'node-fetch'; -import config from '../config'; -import { ApiError } from '../utils'; -import parentLogger from '../config/logger'; - -const logger = parentLogger.child({ module: 'OciService' }); - -async function getProfiles(address: string, chainId: number) { - try { - logger.debug(`${config.ociBackendURL}/oci/profiles/${chainId}/${address}`); - const response = await fetch(`${config.ociBackendURL}/oci/profiles/${chainId}/${address}`, { - method: 'GET', - headers: { 'Content-Type': 'application/json' }, - }); - if (response.ok) { - return await response.json(); - } else { - const errorResponse = await response.text(); - throw new Error(errorResponse); - } - } catch (error: any) { - logger.error(error, 'Failed to get profiles from oci backend'); - throw new ApiError(590, 'Failed to get profiles from oci backend '); - } -} - -export default { - getProfiles, -}; diff --git a/src/services/platform.service.ts b/src/services/platform.service.ts index 5b96cf71..3b47b7f5 100644 --- a/src/services/platform.service.ts +++ b/src/services/platform.service.ts @@ -1,17 +1,18 @@ import { Snowflake } from 'discord.js'; import httpStatus from 'http-status'; -import { FilterQuery, HydratedDocument, Types } from 'mongoose'; +import { FilterQuery, HydratedDocument, ObjectId, Types } from 'mongoose'; import { IPlatform, Platform, PlatformNames } from '@togethercrew.dev/db'; import { analyzerAction, analyzerWindow } from '../config/analyzer.statics'; import parentLogger from '../config/logger'; +import { IAuthAndPlatform } from '../interfaces/Request.interface'; import ApiError from '../utils/ApiError'; import discourseService from './discourse'; +import reputationScoreService from './reputationScore.service'; import sagaService from './saga.service'; const logger = parentLogger.child({ module: 'PlatformService' }); - /** * Create a platform * @param {IPlatform} PlatformBody @@ -285,7 +286,34 @@ If you have questions, send a DM to katerinabc (Discord) or k_bc0 (Telegram). logger.error(error, `Failed to send notification to Discord ID: ${userDiscordId}`); } }; +const validatePlatformUpdate = (platform: IAuthAndPlatform['platform'], body: IAuthAndPlatform['body']) => { + if (platform.name !== PlatformNames.Discord) return; + + if (platform.metadata?.isInProgress && (body.metadata?.selectedChannels || body.metadata?.period)) { + throw new ApiError( + httpStatus.BAD_REQUEST, + 'Updating channels or date period is not allowed during server analysis.', + ); + } + if (platform.metadata?.isFetchingInitialData && (body.metadata?.selectedChannels || body.metadata?.period)) { + throw new ApiError( + httpStatus.BAD_REQUEST, + 'Updating channels or date periods is not allowed during the initial fetching of the server.', + ); + } +}; + +/** + * get reputation score + * @param {IPlatform} platform + * @param {IUser} user + */ +const getReputationScore = async (platform: HydratedDocument, userId: ObjectId) => { + return { + reputationScore: (await reputationScoreService.calculateReputationScoreForUser(platform, userId)) * 100, + }; +}; export default { createPlatform, getPlatformById, @@ -298,4 +326,6 @@ export default { managePlatformConnection, callExtractionApp, notifyDiscordUserImportComplete, + validatePlatformUpdate, + getReputationScore, }; diff --git a/src/services/reputationScore.service.ts b/src/services/reputationScore.service.ts new file mode 100644 index 00000000..a7633669 --- /dev/null +++ b/src/services/reputationScore.service.ts @@ -0,0 +1,54 @@ +import { HydratedDocument, ObjectId } from 'mongoose'; + +import { IPlatform } from '@togethercrew.dev/db'; + +import parentLogger from '../config/logger'; +import { NEO4J_PLATFORM_INFO } from '../constants/neo4j.constant'; +import * as Neo4j from '../neo4j'; +import { SupportedNeo4jPlatforms } from '../types/neo4j.type'; + +const logger = parentLogger.child({ module: 'ReputationScoreService' }); + +async function calculateReputationScoreForUser( + platform: HydratedDocument, + userId: ObjectId, +): Promise { + const platformName = platform.name as SupportedNeo4jPlatforms; + const memberLabel = NEO4J_PLATFORM_INFO[platformName].member; + const platformId = platform.id; + + const reputationScoreQuery = buildReputationScoreQuery(userId, platformId, memberLabel); + const neo4jData = await Neo4j.read(reputationScoreQuery); + + return extractReputationScoreFromNeo4jData(neo4jData); +} + +function buildReputationScoreQuery(userId: ObjectId, platformId: string, memberLabel: string): string { + return ` + MATCH (:${memberLabel} {id: "${userId}"})-[r:HAVE_METRICS {platformId: "${platformId}"}]->(a) + WITH r.date as metrics_date, r.closenessCentrality as memberScore + ORDER BY metrics_date DESC + LIMIT 1 + MATCH (user:${memberLabel})-[user_r:HAVE_METRICS {platformId: "${platformId}", date: metrics_date}]->(user) + WITH memberScore, MAX(user_r.closenessCentrality) as maxScore + RETURN memberScore / maxScore AS reputation_score + `; +} + +function extractReputationScoreFromNeo4jData(neo4jData: any): number { + const { records } = neo4jData; + logger.debug(`Neo4j Records: ${JSON.stringify(records)}`); + + if (records.length === 0) { + return 0; + } + + const reputationScoreResponse = records[0]; + const reputationScore = reputationScoreResponse.get('reputation_score'); + + return reputationScore || 0; +} + +export default { + calculateReputationScoreForUser, +}; diff --git a/src/validations/index.ts b/src/validations/index.ts index 3c31c79e..2786c74a 100644 --- a/src/validations/index.ts +++ b/src/validations/index.ts @@ -1,15 +1,15 @@ +import announcementValidation from './announcement.validation'; import authValidation from './auth.validation'; +import communityValidation from './community.validation'; +import discourseValidation from './discourse.validation'; import guildValidation from './guild.validation'; -import userValidation from './user.validation'; import heatmapValidation from './heatmap.validation'; import memberActivityValidation from './memberActivity.validation'; -import communityValidation from './community.validation'; -import platformValidation from './platform.validation'; -import announcementValidation from './announcement.validation'; import moduleValidation from './module.validation'; -import discourseValidation from './discourse.validation'; -import nftValidation from './nft.validation'; +import platformValidation from './platform.validation'; import telegramValidation from './telegram.validation'; +import userValidation from './user.validation'; + export { authValidation, guildValidation, @@ -21,6 +21,5 @@ export { announcementValidation, moduleValidation, discourseValidation, - nftValidation, telegramValidation, }; diff --git a/src/validations/nft.validation.ts b/src/validations/nft.validation.ts deleted file mode 100644 index be86127a..00000000 --- a/src/validations/nft.validation.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Joi from 'joi'; -import { PlatformNames } from '@togethercrew.dev/db'; - -const getReputationScore = { - params: Joi.object().keys({ - tokenId: Joi.string().required(), - address: Joi.string() - .regex(/^0x[a-fA-F0-9]{40}$/) - .required(), - }), -}; - -export default { - getReputationScore, -}; diff --git a/src/validations/platform.validation.ts b/src/validations/platform.validation.ts index d75a10e3..1ce249e5 100644 --- a/src/validations/platform.validation.ts +++ b/src/validations/platform.validation.ts @@ -1,10 +1,10 @@ -import Joi from 'joi'; import { Request } from 'express'; -import { objectId } from './custom.validation'; -import { IAuthAndPlatform } from '../interfaces'; -import { Types } from 'mongoose'; +import Joi from 'joi'; + import { PlatformNames } from '@togethercrew.dev/db'; +import { objectId } from './custom.validation'; + const discordCreateMetadata = () => { return Joi.object().keys({ id: Joi.string().required(), @@ -171,6 +171,12 @@ const getPlatform = { }), }; +const getReputationScore = { + params: Joi.object().keys({ + platformId: Joi.string().custom(objectId), + }), +}; + const deletePlatform = { params: Joi.object().keys({ platformId: Joi.string().custom(objectId), @@ -322,4 +328,5 @@ export default { dynamicUpdatePlatform, dynamicPlatformProperty, dynamicRequestAccess, + getReputationScore, };