Skip to content

Commit

Permalink
Merge pull request #9019 from weseek/imprv/serializers
Browse files Browse the repository at this point in the history
imprv: Serializers for User model and Attachment model
  • Loading branch information
yuki-takei authored Aug 8, 2024
2 parents fb07634 + fc03fb2 commit a1df330
Show file tree
Hide file tree
Showing 38 changed files with 300 additions and 221 deletions.
5 changes: 5 additions & 0 deletions .changeset/metal-donkeys-collect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@growi/core': minor
---

Transplant and re-implement serializers for User and Attachment
2 changes: 1 addition & 1 deletion apps/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@
"usehooks-ts": "^2.6.0",
"validator": "^13.7.0",
"ws": "^8.17.1",
"xss": "^1.0.14",
"xss": "^1.0.15",
"y-mongodb-provider": "^0.2.0",
"y-socket.io": "^1.1.3",
"yjs": "^13.6.18"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ type Props = {
activityList: IActivityHasId[]
}

const formatDate = (date) => {
const formatDate = (date: Date): string => {
return format(new Date(date), 'yyyy/MM/dd HH:mm:ss');
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { ErrorV3 } from '@growi/core/dist/models';
import { Router, Request } from 'express';
import type { Router, Request } from 'express';

import { IExternalUserGroupRelationHasId } from '~/features/external-user-group/interfaces/external-user-group';
import type { IExternalUserGroupRelationHasId } from '~/features/external-user-group/interfaces/external-user-group';
import ExternalUserGroupRelation from '~/features/external-user-group/server/models/external-user-group-relation';
import Crowi from '~/server/crowi';
import type Crowi from '~/server/crowi';
import { serializeUserGroupRelationSecurely } from '~/server/models/serializers/user-group-relation-serializer';
import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
import loggerFactory from '~/utils/logger';

import { ApiV3Response } from '../../../../../server/routes/apiv3/interfaces/apiv3-response';

const logger = loggerFactory('growi:routes:apiv3:user-group-relation'); // eslint-disable-line no-unused-vars

const express = require('express');
const { query } = require('express-validator');

const { serializeUserGroupRelationSecurely } = require('~/server/models/serializers/user-group-relation-serializer');

const router = express.Router();

Expand Down
3 changes: 2 additions & 1 deletion apps/app/src/server/middlewares/access-token-parser.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';

import loggerFactory from '~/utils/logger';

const { serializeUserSecurely } = require('../models/serializers/user-serializer');

const logger = loggerFactory('growi:middleware:access-token-parser');

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { serializePageSecurely } = require('./page-serializer');
import { serializePageSecurely } from './page-serializer';

function serializeInsecurePageAttributes(bookmark) {
if (bookmark.page != null && bookmark.page._id != null) {
Expand Down
1 change: 0 additions & 1 deletion apps/app/src/server/models/serializers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,3 @@ export * from './bookmark-serializer';
export * from './page-serializer';
export * from './revision-serializer';
export * from './user-group-relation-serializer';
export * from './user-serializer';
2 changes: 1 addition & 1 deletion apps/app/src/server/models/serializers/page-serializer.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { serializeUserSecurely } = require('./user-serializer');
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';

function depopulate(page, attributeName) {
// revert the ObjectID
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { serializeUserSecurely } = require('./user-serializer');
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';

function serializeInsecureUserAttributes(revision) {
if (revision.author != null && revision.author._id != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { serializeUserSecurely } = require('./user-serializer');
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';

function serializeInsecureUserAttributes(userGroupRelation) {
if (userGroupRelation.relatedUser != null && userGroupRelation.relatedUser._id != null) {
Expand Down
35 changes: 0 additions & 35 deletions apps/app/src/server/models/serializers/user-serializer.js

This file was deleted.

3 changes: 1 addition & 2 deletions apps/app/src/server/models/user.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* eslint-disable no-use-before-define */
import { omitInsecureAttributes } from '@growi/core/dist/models/serializers';
import { pagePathUtils } from '@growi/core/dist/utils';

import { i18n } from '^/config/next-i18next.config';
Expand All @@ -15,8 +16,6 @@ const mongoose = require('mongoose');
const mongoosePaginate = require('mongoose-paginate-v2');
const uniqueValidator = require('mongoose-unique-validator');

const { omitInsecureAttributes } = require('./serializers/user-serializer');

const logger = loggerFactory('growi:models:user');

module.exports = function(crowi) {
Expand Down
22 changes: 12 additions & 10 deletions apps/app/src/server/routes/apiv3/activity.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
import { parseISO, addMinutes, isValid } from 'date-fns';
import express, { Request, Router } from 'express';
import type { Request, Router } from 'express';
import express from 'express';
import { query } from 'express-validator';

import { IActivity, ISearchFilter } from '~/interfaces/activity';
import type { IActivity, ISearchFilter } from '~/interfaces/activity';
import Activity from '~/server/models/activity';
import loggerFactory from '~/utils/logger';

import Crowi from '../../crowi';
import type Crowi from '../../crowi';
import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
import { serializeUserSecurely } from '../../models/serializers/user-serializer';

import { ApiV3Response } from './interfaces/apiv3-response';
import type { ApiV3Response } from './interfaces/apiv3-response';


const logger = loggerFactory('growi:routes:apiv3:activity');
Expand Down Expand Up @@ -96,19 +97,20 @@ module.exports = (crowi: Crowi): Router => {
const paginateResult = await Activity.paginate(
query,
{
lean: true,
limit,
offset,
sort: { createdAt: -1 },
populate: 'user',
},
);

const User = crowi.model('User');
const serializedDocs = paginateResult.docs.map((doc: IActivity) => {
if (doc.user != null && doc.user instanceof User) {
doc.user = serializeUserSecurely(doc.user);
}
return doc;
const { user, ...rest } = doc;
return {
user: serializeUserSecurely(user),
...rest,
};
});

const serializedPaginationResult = {
Expand Down
9 changes: 4 additions & 5 deletions apps/app/src/server/routes/apiv3/attachment.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { ErrorV3 } from '@growi/core/dist/models';
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
import express from 'express';
import multer from 'multer';
import autoReap from 'multer-autoreap';

import { SupportedAction } from '~/interfaces/activity';
import { AttachmentType } from '~/server/interfaces/attachment';
import { Attachment } from '~/server/models';
import { Attachment } from '~/server/models/attachment';
import { serializePageSecurely, serializeRevisionSecurely } from '~/server/models/serializers';
import loggerFactory from '~/utils/logger';

import { generateAddActivityMiddleware } from '../../middlewares/add-activity';
Expand All @@ -14,16 +17,12 @@ import { excludeReadOnlyUser } from '../../middlewares/exclude-read-only-user';


const logger = loggerFactory('growi:routes:apiv3:attachment'); // eslint-disable-line no-unused-vars
const express = require('express');

const router = express.Router();
const {
query, param, body,
} = require('express-validator');

const { serializePageSecurely } = require('../../models/serializers/page-serializer');
const { serializeRevisionSecurely } = require('../../models/serializers/revision-serializer');
const { serializeUserSecurely } = require('../../models/serializers/user-serializer');

/**
* @swagger
Expand Down
3 changes: 2 additions & 1 deletion apps/app/src/server/routes/apiv3/bookmarks.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';

import { SupportedAction, SupportedTargetModel } from '~/interfaces/activity';
import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
import { serializeBookmarkSecurely } from '~/server/models/serializers/bookmark-serializer';
Expand All @@ -12,7 +14,6 @@ const logger = loggerFactory('growi:routes:apiv3:bookmarks'); // eslint-disable-
const express = require('express');
const { body, query, param } = require('express-validator');

const { serializeUserSecurely } = require('../../models/serializers/user-serializer');

const router = express.Router();

Expand Down
2 changes: 1 addition & 1 deletion apps/app/src/server/routes/apiv3/forgot-password.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ErrorV3 } from '@growi/core/dist/models';
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
import { format, subSeconds } from 'date-fns';

import { SupportedAction } from '~/interfaces/activity';
Expand All @@ -17,7 +18,6 @@ const logger = loggerFactory('growi:routes:apiv3:forgotPassword'); // eslint-dis
const express = require('express');
const { body } = require('express-validator');

const { serializeUserSecurely } = require('../../models/serializers/user-serializer');

const router = express.Router();

Expand Down
48 changes: 31 additions & 17 deletions apps/app/src/server/routes/apiv3/in-app-notification.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
import express from 'express';

import { SupportedAction } from '~/interfaces/activity';
import type { CrowiRequest } from '~/interfaces/crowi-request';
import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';

import type { IInAppNotification } from '../../../interfaces/in-app-notification';

import { IInAppNotification } from '../../../interfaces/in-app-notification';

const express = require('express');
import type { ApiV3Response } from './interfaces/apiv3-response';

const { serializeUserSecurely } = require('../../models/serializers/user-serializer');

const router = express.Router();

Expand All @@ -22,14 +24,18 @@ module.exports = (crowi) => {

const activityEvent = crowi.event('activity');

router.get('/list', accessTokenParser, loginRequiredStrictly, async(req, res) => {
const user = req.user;
router.get('/list', accessTokenParser, loginRequiredStrictly, async(req: CrowiRequest, res: ApiV3Response) => {
// user must be set by loginRequiredStrictly
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const user = req.user!;

const limit = parseInt(req.query.limit) || 10;
const limit = req.query.limit != null
? parseInt(req.query.limit.toString()) || 10
: 10;

let offset = 0;
if (req.query.offset) {
offset = parseInt(req.query.offset, 10);
if (req.query.offset != null) {
offset = parseInt(req.query.offset.toString(), 10);
}

const queryOptions = {
Expand Down Expand Up @@ -73,18 +79,21 @@ module.exports = (crowi) => {
return res.apiv3(serializedPaginationResult);
});

router.get('/status', accessTokenParser, loginRequiredStrictly, async(req, res) => {
const userId = req.user._id;
router.get('/status', accessTokenParser, loginRequiredStrictly, async(req: CrowiRequest, res: ApiV3Response) => {
// user must be set by loginRequiredStrictly
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const user = req.user!;

try {
const count = await inAppNotificationService.getUnreadCountByUser(userId);
const count = await inAppNotificationService.getUnreadCountByUser(user._id);
return res.apiv3({ count });
}
catch (err) {
return res.apiv3Err(err);
}
});

router.post('/read', accessTokenParser, loginRequiredStrictly, async(req, res) => {
router.post('/read', accessTokenParser, loginRequiredStrictly, async(req: CrowiRequest, res: ApiV3Response) => {
const user = req.user;

try {
Expand All @@ -96,8 +105,11 @@ module.exports = (crowi) => {
}
});

router.post('/open', accessTokenParser, loginRequiredStrictly, async(req, res) => {
const user = req.user;
router.post('/open', accessTokenParser, loginRequiredStrictly, async(req: CrowiRequest, res: ApiV3Response) => {
// user must be set by loginRequiredStrictly
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const user = req.user!;

const id = req.body.id;

try {
Expand All @@ -110,8 +122,10 @@ module.exports = (crowi) => {
}
});

router.put('/all-statuses-open', accessTokenParser, loginRequiredStrictly, addActivity, async(req, res) => {
const user = req.user;
router.put('/all-statuses-open', accessTokenParser, loginRequiredStrictly, addActivity, async(req: CrowiRequest, res: ApiV3Response) => {
// user must be set by loginRequiredStrictly
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const user = req.user!;

try {
await inAppNotificationService.updateAllNotificationsAsOpened(user);
Expand Down
5 changes: 2 additions & 3 deletions apps/app/src/server/routes/apiv3/page/create-page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@ import { subscribeRuleNames } from '~/interfaces/in-app-notification';
import type { IOptionsForCreate } from '~/interfaces/page';
import type Crowi from '~/server/crowi';
import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
import {
GlobalNotificationSettingEvent, serializePageSecurely, serializeRevisionSecurely,
} from '~/server/models';
import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificationSetting';
import type { PageDocument, PageModel } from '~/server/models/page';
import PageTagRelation from '~/server/models/page-tag-relation';
import { serializePageSecurely, serializeRevisionSecurely } from '~/server/models/serializers';
import { configManager } from '~/server/service/config-manager';
import { getTranslation } from '~/server/service/i18next';
import loggerFactory from '~/utils/logger';
Expand Down
6 changes: 3 additions & 3 deletions apps/app/src/server/routes/apiv3/page/update-page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type {
IPage, IRevisionHasId, IUserHasId,
} from '@growi/core';
import { ErrorV3 } from '@growi/core/dist/models';
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
import type { Request, RequestHandler } from 'express';
import type { ValidationChain } from 'express-validator';
import { body } from 'express-validator';
Expand All @@ -13,10 +14,9 @@ import { type IApiv3PageUpdateParams, PageUpdateErrorCode } from '~/interfaces/a
import type { IOptionsForUpdate } from '~/interfaces/page';
import type Crowi from '~/server/crowi';
import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
import {
GlobalNotificationSettingEvent, serializePageSecurely, serializeRevisionSecurely, serializeUserSecurely,
} from '~/server/models';
import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificationSetting';
import type { PageDocument, PageModel } from '~/server/models/page';
import { serializePageSecurely, serializeRevisionSecurely } from '~/server/models/serializers';
import { preNotifyService } from '~/server/service/pre-notify';
import { normalizeLatestRevisionIfBroken } from '~/server/service/revision/normalize-latest-revision-if-broken';
import { getYjsService } from '~/server/service/yjs';
Expand Down
Loading

0 comments on commit a1df330

Please sign in to comment.