Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

imprv: Serializers for User model and Attachment model #9019

Merged
merged 17 commits into from
Aug 8, 2024
Merged
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
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
4 changes: 2 additions & 2 deletions apps/app/src/server/routes/apiv3/pages/index.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@

import { PageGrant } from '@growi/core';
import { ErrorV3 } from '@growi/core/dist/models';
import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
import { isCreatablePage, isTrashPage, isUserPage } from '@growi/core/dist/utils/page-path-utils';
import { normalizePath, addHeadingSlash } from '@growi/core/dist/utils/path-utils';
import express from 'express';
import { body, query } from 'express-validator';

import { SupportedTargetModel, SupportedAction } from '~/interfaces/activity';
import { subscribeRuleNames } from '~/interfaces/in-app-notification';
import { GlobalNotificationSettingEvent } from '~/server/models';
import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificationSetting';
import PageTagRelation from '~/server/models/page-tag-relation';
import { preNotifyService } from '~/server/service/pre-notify';
import loggerFactory from '~/utils/logger';
Expand All @@ -17,7 +18,6 @@ import { generateAddActivityMiddleware } from '../../../middlewares/add-activity
import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
import { excludeReadOnlyUser } from '../../../middlewares/exclude-read-only-user';
import { serializePageSecurely } from '../../../models/serializers/page-serializer';
import { serializeUserSecurely } from '../../../models/serializers/user-serializer';
import { isV5ConversionError } from '../../../models/vo/v5-conversion-error';


Expand Down
Loading
Loading