From e99b51895afd532a529744396ecae87d47c68503 Mon Sep 17 00:00:00 2001 From: eug-vs Date: Sun, 21 Jun 2020 14:29:59 +0300 Subject: feat: change hooks and install which-types --- app.ts | 2 +- hooks/convertPoll.ts | 45 +++++++++++++++++++++++++++++++++++++ hooks/expandAuthor.ts | 45 ------------------------------------- models/polls/poll.schema.ts | 15 ------------- models/users/user.schema.ts | 7 +----- package-lock.json | 5 +++++ package.json | 3 ++- populateDb.ts | 4 +--- services/auth/auth.service.ts | 2 +- services/polls/polls.hooks.ts | 10 ++++----- services/profiles/profiles.hooks.ts | 6 ++--- 11 files changed, 64 insertions(+), 80 deletions(-) create mode 100644 hooks/convertPoll.ts delete mode 100644 hooks/expandAuthor.ts diff --git a/app.ts b/app.ts index 0623ef3..4d699fb 100644 --- a/app.ts +++ b/app.ts @@ -1,7 +1,7 @@ import feathers from '@feathersjs/feathers'; import express from '@feathersjs/express'; import socketio from '@feathersjs/socketio'; -import configuration from '@feathersjs/configuration' +import configuration from '@feathersjs/configuration'; import '@feathersjs/transport-commons'; import cors from 'cors'; diff --git a/hooks/convertPoll.ts b/hooks/convertPoll.ts new file mode 100644 index 0000000..62ddea1 --- /dev/null +++ b/hooks/convertPoll.ts @@ -0,0 +1,45 @@ +import { HookContext } from '@feathersjs/feathers'; +import bluebird from 'bluebird'; +import _ from 'lodash'; +import { Poll, User } from 'which-types'; + +import { PollSchema } from '../models/polls/poll.schema'; +import UserModel from '../models/users/user.model'; + +const convertPoll = async (poll: PollSchema): Promise => { + return UserModel.findById(poll.authorId) + .lean() + .exec() + .then((author: User | null): Poll | null => { + return author && _.merge( + _.omit(poll, ['authorId']), + { + author, + contents: { + left: { + votes: poll.contents.left.votes.length + }, + right: { + votes: poll.contents.right.votes.length + } + } + } + ); + }) + .catch(err => { + console.error(err); + return err; + }); +}; + +export const convertPollHook = async (context: HookContext): Promise => { + context.result = await convertPoll(context.result); + return context; +}; + +export const convertPollManyHook = async (context: HookContext): Promise => { + const polls = await bluebird.map(context.result, (poll: PollSchema) => convertPoll(poll)); + context.result = _.compact(polls); + return context; +}; + diff --git a/hooks/expandAuthor.ts b/hooks/expandAuthor.ts deleted file mode 100644 index 5993839..0000000 --- a/hooks/expandAuthor.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { HookContext } from '@feathersjs/feathers'; -import bluebird from 'bluebird'; -import _ from 'lodash'; - -import { Poll, PollSchema } from '../models/polls/poll.schema'; -import { User } from '../models/users/user.schema'; -import UserModel from '../models/users/user.model'; - -const convertPoll = async (poll: PollSchema): Promise => { - return UserModel.findById(poll.authorId) - .lean() - .exec() - .then((author: User | null): Poll | null => { - return author && { - _id: poll._id, - author, - contents: { - left: { - url: poll.contents.left.url, - votes: poll.contents.left.votes.length - }, - right: { - url: poll.contents.right.url, - votes: poll.contents.right.votes.length - } - } - }; - }) - .catch(err => { - console.error(err); - return err; - }); -}; - -export const expandAuthorHook = async (context: HookContext): Promise => { - context.result = await convertPoll(context.result); - return context; -}; - -export const expandAuthorManyHook = async (context: HookContext): Promise => { - const polls = await bluebird.map(context.result, (poll: PollSchema) => convertPoll(poll)); - context.result = _.compact(polls); - return context; -}; - diff --git a/models/polls/poll.schema.ts b/models/polls/poll.schema.ts index 236011f..fd6751c 100644 --- a/models/polls/poll.schema.ts +++ b/models/polls/poll.schema.ts @@ -1,19 +1,4 @@ import { Document, Schema, Types } from 'mongoose'; -import { User } from '../users/user.schema'; - -export interface ImageData { - url: string; - votes: number; -} - -export interface Poll { - _id: string; - author: User; - contents: { - left: ImageData; - right: ImageData; - }; -} export interface ImageDataSchema { url: string; diff --git a/models/users/user.schema.ts b/models/users/user.schema.ts index fd7d1e1..9030d61 100644 --- a/models/users/user.schema.ts +++ b/models/users/user.schema.ts @@ -1,10 +1,5 @@ import { Document, Schema } from 'mongoose'; - -export interface User { - name: string; - avatarUrl?: string; - age?: number; -} +import { User } from 'which-types'; export interface UserSchema extends Document, User { password: string; diff --git a/package-lock.json b/package-lock.json index 771797b..6f78e7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3050,6 +3050,11 @@ "isexe": "^2.0.0" } }, + "which-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/which-types/-/which-types-1.0.3.tgz", + "integrity": "sha512-anON+pR6+GeT+aCRhxK0Vj3AQvo6COSOG1zPy24VDxXnxluCvK5tNmlV+1Oe771lOjl0z3LEvc1B7YL5xYtFqQ==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 7116faa..7b27466 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "cors": "^2.8.5", "feathers-mongoose": "^8.3.0", "lodash": "^4.17.15", - "mongoose": "^5.9.18" + "mongoose": "^5.9.18", + "which-types": "^1.0.3" }, "repository": { "type": "git", diff --git a/populateDb.ts b/populateDb.ts index ae42d86..a666427 100644 --- a/populateDb.ts +++ b/populateDb.ts @@ -29,9 +29,7 @@ const names: string[] = [ ]; - const createPoll = (authorId: string, generateImageData:()=> ImageDataSchema): Promise => { - return app.service('polls').create({ contents: { left: generateImageData(), @@ -60,7 +58,7 @@ const populate = async () => { await bluebird.mapSeries(new Array(POLLS_AMOUNT), async () => { const sampleUser = _.sample(users); - return createPoll(sampleUser?._id,generateImageData); + return createPoll(sampleUser?._id, generateImageData); }); }; diff --git a/services/auth/auth.service.ts b/services/auth/auth.service.ts index 42846b0..826357c 100644 --- a/services/auth/auth.service.ts +++ b/services/auth/auth.service.ts @@ -1,6 +1,6 @@ import { AuthenticationService, - JWTStrategy + JWTStrategy } from '@feathersjs/authentication'; import { LocalStrategy } from '@feathersjs/authentication-local'; import { Application } from '@feathersjs/express'; diff --git a/services/polls/polls.hooks.ts b/services/polls/polls.hooks.ts index 0637320..a914cd0 100644 --- a/services/polls/polls.hooks.ts +++ b/services/polls/polls.hooks.ts @@ -1,12 +1,12 @@ import { - expandAuthorHook, - expandAuthorManyHook -} from '../../hooks/expandAuthor'; + convertPollHook, + convertPollManyHook +} from '../../hooks/convertPoll'; export default { after: { - get: [expandAuthorHook], - find: [expandAuthorManyHook] + get: [convertPollHook], + find: [convertPollManyHook] } }; diff --git a/services/profiles/profiles.hooks.ts b/services/profiles/profiles.hooks.ts index bb05d94..4447bee 100644 --- a/services/profiles/profiles.hooks.ts +++ b/services/profiles/profiles.hooks.ts @@ -1,10 +1,10 @@ import { - expandAuthorManyHook -} from '../../hooks/expandAuthor'; + convertPollManyHook +} from '../../hooks/convertPoll'; export default { after: { - get: [expandAuthorManyHook] + get: [convertPollManyHook] } }; -- cgit v1.2.3