aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilyayudovin <ilyayudovin123@gmail.com>2020-06-21 13:10:05 +0300
committereug-vs <eug-vs@keemail.me>2020-06-21 13:13:27 +0300
commitf4c4f2d4789880c0cfc956d08aab10b5a93ebcb1 (patch)
treede24c4c3ede7d0df755aebbba8cadbf6169d1b0d
parent29dce80de9267a4886c6a598ec90756995821828 (diff)
downloadwhich-api-f4c4f2d4789880c0cfc956d08aab10b5a93ebcb1.tar.gz
feat: change votes type
-rw-r--r--hooks/expandAuthor.ts21
-rw-r--r--models/polls/poll.schema.ts17
-rw-r--r--populateDb.ts17
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);
});
};