diff options
author | ilyayudovin <ilyayudovin123@gmail.com> | 2020-06-21 13:10:05 +0300 |
---|---|---|
committer | eug-vs <eug-vs@keemail.me> | 2020-06-21 13:13:27 +0300 |
commit | f4c4f2d4789880c0cfc956d08aab10b5a93ebcb1 (patch) | |
tree | de24c4c3ede7d0df755aebbba8cadbf6169d1b0d | |
parent | 29dce80de9267a4886c6a598ec90756995821828 (diff) | |
download | which-api-f4c4f2d4789880c0cfc956d08aab10b5a93ebcb1.tar.gz |
feat: change votes type
-rw-r--r-- | hooks/expandAuthor.ts | 21 | ||||
-rw-r--r-- | models/polls/poll.schema.ts | 17 | ||||
-rw-r--r-- | populateDb.ts | 17 |
3 files changed, 40 insertions, 15 deletions
diff --git a/hooks/expandAuthor.ts b/hooks/expandAuthor.ts index 3b3e3df..5993839 100644 --- a/hooks/expandAuthor.ts +++ b/hooks/expandAuthor.ts @@ -6,12 +6,25 @@ import { Poll, PollSchema } from '../models/polls/poll.schema'; import { User } from '../models/users/user.schema'; import UserModel from '../models/users/user.model'; -const expandAuthor = async (poll: PollSchema): Promise<Poll | null> => { +const convertPoll = async (poll: PollSchema): Promise<Poll | null> => { return UserModel.findById(poll.authorId) .lean<User>() .exec() .then((author: User | null): Poll | null => { - return author && _.merge(_.omit(poll, 'authorId'), { author }); + 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); @@ -20,12 +33,12 @@ const expandAuthor = async (poll: PollSchema): Promise<Poll | null> => { }; export const expandAuthorHook = async (context: HookContext): Promise<HookContext> => { - context.result = await expandAuthor(context.result); + context.result = await convertPoll(context.result); return context; }; export const expandAuthorManyHook = async (context: HookContext): Promise<HookContext> => { - const polls = await bluebird.map(context.result, (poll: PollSchema) => expandAuthor(poll)); + 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 bc6d497..236011f 100644 --- a/models/polls/poll.schema.ts +++ b/models/polls/poll.schema.ts @@ -7,6 +7,7 @@ export interface ImageData { } export interface Poll { + _id: string; author: User; contents: { left: ImageData; @@ -14,14 +15,22 @@ export interface Poll { }; } -export interface PollSchema extends Document, Omit<Poll, 'author'> { - authorId: string; +export interface ImageDataSchema { + url: string; + votes: string[]; } +export interface PollSchema extends Document { + contents: { + left: ImageDataSchema; + right: ImageDataSchema; + }; + authorId: string; +} -const imageDataSchema = { +export const imageDataSchema = { url: String, - votes: Number + votes: [Types.ObjectId] }; export const pollSchema = new Schema({ diff --git a/populateDb.ts b/populateDb.ts index a21b669..ae42d86 100644 --- a/populateDb.ts +++ b/populateDb.ts @@ -3,7 +3,7 @@ import bluebird from 'bluebird'; import _ from 'lodash'; import app from './app'; import { UserSchema } from './models/users/user.schema'; -import { PollSchema, ImageData } from './models/polls/poll.schema'; +import { PollSchema, ImageDataSchema } from './models/polls/poll.schema'; mongoose.connect('mongodb://localhost:27017/which', { useNewUrlParser: true }); @@ -28,12 +28,10 @@ const names: string[] = [ 'William' ]; -const generateImageData = (): ImageData => ({ - url: _.sample(imageUrls) || '', - votes: Math.floor(Math.random() * 101) -}); -const createPoll = (authorId: string): Promise<PollSchema> => { + +const createPoll = (authorId: string, generateImageData:()=> ImageDataSchema): Promise<PollSchema> => { + return app.service('polls').create({ contents: { left: generateImageData(), @@ -55,9 +53,14 @@ const createUser = (name: string): Promise<UserSchema> => { const populate = async () => { const users = await bluebird.map(names, name => createUser(name)); + const generateImageData = (): ImageDataSchema => ({ + url: _.sample(imageUrls) || '', + votes: _.sampleSize(users.map(user => user._id), Math.floor(Math.random() * users.length)) + }); + await bluebird.mapSeries(new Array(POLLS_AMOUNT), async () => { const sampleUser = _.sample(users); - return createPoll(sampleUser?._id); + return createPoll(sampleUser?._id,generateImageData); }); }; |