Skip to content

Commit

Permalink
chore: introduce query-params service to remove strapi.global dep in …
Browse files Browse the repository at this point in the history
…utils
  • Loading branch information
alexandrebodin committed Mar 25, 2024
1 parent 5f5cb55 commit 6449ad5
Show file tree
Hide file tree
Showing 22 changed files with 573 additions and 481 deletions.
@@ -1,8 +1,4 @@
jest.mock('../review-workflows/workflows/content-types', () => {
return jest.fn(() => ({
migrate: jest.fn(),
}));
});
import { queryParams } from '@strapi/utils';

import type { Core } from '@strapi/types';
import workflowsServiceFactory from '../review-workflows/workflows';
Expand All @@ -11,6 +7,12 @@ import workflowCT from '../../content-types/workflow';
import workflowStageCT from '../../content-types/workflow-stage';
import CTS from '../../../../../server/src/content-types';

jest.mock('../review-workflows/workflows/content-types', () => {
return jest.fn(() => ({
migrate: jest.fn(),
}));
});

const workflowMock = {
id: 1,
};
Expand Down Expand Up @@ -82,6 +84,19 @@ const strapiMock = {
query: () => dbMock,
transaction: jest.fn((func) => func()),
},
get(name: string) {
if (name === 'query-params') {
const transformer = queryParams.createTransformer({
getModel(name: string) {
return strapi.getModel(name as any);
},
});

return {
transform: transformer.transformQueryParams,
};
}
},
} as unknown as Core.LoadedStrapi;

const ctMap: Record<string, any> = {
Expand Down
@@ -1,6 +1,6 @@
import type { Core } from '@strapi/types';
import { set, isString, map, get } from 'lodash/fp';
import { convertQueryParams, errors } from '@strapi/utils';
import { errors } from '@strapi/utils';
import { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../../../constants/workflows';
import { getService } from '../../../utils';
import { getWorkflowContentTypeFilter } from '../../../utils/review-workflows';
Expand Down Expand Up @@ -43,7 +43,7 @@ export default ({ strapi }: { strapi: Core.LoadedStrapi }) => {
const filters = processFilters({ strapi }, opts.filters);
const populate = processPopulate(opts.populate);

const query = convertQueryParams.transformParamsToQuery(WORKFLOW_MODEL_UID, {
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {
...opts,
filters,
populate,
Expand All @@ -61,7 +61,7 @@ export default ({ strapi }: { strapi: Core.LoadedStrapi }) => {
findById(id: any, opts: { populate?: any } = {}) {
const populate = processPopulate(opts.populate);

const query = convertQueryParams.transformParamsToQuery(WORKFLOW_MODEL_UID, { populate });
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, { populate });

return strapi.db.query(WORKFLOW_MODEL_UID).findOne({
...query,
Expand Down Expand Up @@ -101,7 +101,7 @@ export default ({ strapi }: { strapi: Core.LoadedStrapi }) => {
// Create Workflow
return strapi.db
.query(WORKFLOW_MODEL_UID)
.create(convertQueryParams.transformParamsToQuery(WORKFLOW_MODEL_UID, createOpts));
.create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));
});
},

Expand Down Expand Up @@ -145,7 +145,7 @@ export default ({ strapi }: { strapi: Core.LoadedStrapi }) => {

metrics.sendDidEditWorkflow();

const query = convertQueryParams.transformParamsToQuery(WORKFLOW_MODEL_UID, updateOpts);
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);

// Update Workflow
return strapi.db.query(WORKFLOW_MODEL_UID).update({
Expand Down Expand Up @@ -181,7 +181,7 @@ export default ({ strapi }: { strapi: Core.LoadedStrapi }) => {
destContentTypes: [],
});

const query = convertQueryParams.transformParamsToQuery(WORKFLOW_MODEL_UID, opts);
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);
// Delete Workflow
return strapi.db.query(WORKFLOW_MODEL_UID).delete({
...query,
Expand Down
22 changes: 22 additions & 0 deletions packages/core/admin/server/src/services/__tests__/role.test.ts
@@ -1,4 +1,5 @@
import _ from 'lodash';
import { queryParams } from '@strapi/utils';
import constants from '../constants';
import { create as createPermission, toPermission } from '../../domain/permission';
import roleContentType from '../../content-types/Role';
Expand All @@ -24,13 +25,30 @@ const {

const { SUPER_ADMIN_CODE } = constants;

const strapiMock = {
get(name: string) {
if (name === 'query-params') {
const transformer = queryParams.createTransformer({
getModel(name: string) {
return strapi.getModel(name as any);
},
});

return {
transform: transformer.transformQueryParams,
};
}
},
};

describe('Role', () => {
describe('create', () => {
test('Creates a role', async () => {
const dbCreate = jest.fn(({ data }) => Promise.resolve(data));
const dbCount = jest.fn(() => Promise.resolve(0));

global.strapi = {
...strapiMock,
db: { query: () => ({ create: dbCreate, count: dbCount }) },
eventHub: {
emit: jest.fn(),
Expand Down Expand Up @@ -60,6 +78,7 @@ describe('Role', () => {
const dbFindOne = jest.fn(({ where: { id } }) => Promise.resolve(_.find([role], { id })));

global.strapi = {
...strapiMock,
db: { query: () => ({ findOne: dbFindOne }) },
} as any;

Expand All @@ -81,6 +100,7 @@ describe('Role', () => {
);
const dbCount = jest.fn(() => Promise.resolve(0));
global.strapi = {
...strapiMock,
db: { query: () => ({ findOne: dbFindOne, count: dbCount }) },
} as any;

Expand All @@ -105,6 +125,7 @@ describe('Role', () => {
const dbFind = jest.fn(() => Promise.resolve(roles));

global.strapi = {
...strapiMock,
db: { query: () => ({ findMany: dbFind }) },
} as any;

Expand All @@ -130,6 +151,7 @@ describe('Role', () => {
const findMany = jest.fn(() => Promise.resolve(roles));

global.strapi = {
...strapiMock,
getModel: () => roleContentType,
db: { query: () => ({ count: dbCount, findMany }) },
} as any;
Expand Down
15 changes: 14 additions & 1 deletion packages/core/admin/server/src/services/__tests__/user.test.ts
@@ -1,5 +1,5 @@
import _ from 'lodash';
import { errors } from '@strapi/utils';
import { errors, queryParams } from '@strapi/utils';
import constants from '../constants';
import userService from '../user';
import userContentType from '../../content-types/User';
Expand All @@ -26,6 +26,19 @@ const {
describe('User', () => {
global.strapi = {
getModel: jest.fn(() => userContentType),
get(name: string) {
if (name === 'query-params') {
const transformer = queryParams.createTransformer({
getModel(name: string) {
return strapi.getModel(name as any);
},
});

return {
transform: transformer.transformQueryParams,
};
}
},
} as any;

describe('sanitizeUser', () => {
Expand Down
4 changes: 2 additions & 2 deletions packages/core/admin/server/src/services/role.ts
Expand Up @@ -3,7 +3,7 @@
import _ from 'lodash';
import { set, omit, pick, prop, isArray, differenceWith, differenceBy, isEqual } from 'lodash/fp';

import { dates, arrays, hooks as hooksUtils, errors, convertQueryParams } from '@strapi/utils';
import { dates, arrays, hooks as hooksUtils, errors } from '@strapi/utils';
import type { Data } from '@strapi/types';

import permissionDomain from '../domain/permission';
Expand Down Expand Up @@ -118,7 +118,7 @@ const find = (params = {}, populate: unknown): Promise<AdminRole[]> => {
const findAllWithUsersCount = async (params: any): Promise<AdminRoleWithUsersCount[]> => {
const roles: AdminRoleWithUsersCount[] = await strapi.db
.query('admin::role')
.findMany(convertQueryParams.transformParamsToQuery('admin::role', params));
.findMany(strapi.get('query-params').transform('admin::role', params));

for (const role of roles) {
role.usersCount = await getUsersCount(role.id);
Expand Down
9 changes: 4 additions & 5 deletions packages/core/admin/server/src/services/user.ts
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import _ from 'lodash';
import { defaults } from 'lodash/fp';
import { arrays, convertQueryParams, errors } from '@strapi/utils';
import { arrays, errors } from '@strapi/utils';
import type { Data } from '@strapi/types';
import { createUser, hasSuperAdminRole } from '../domain/user';
import type {
Expand Down Expand Up @@ -240,10 +240,9 @@ const findOneByEmail = async (email: string, populate = []) => {
* @param params
*/
const findPage = async (params = {}): Promise<unknown> => {
const query = convertQueryParams.transformParamsToQuery(
'admin::user',
defaults({ populate: ['roles'] }, params)
);
const query = strapi
.get('query-params')
.transform('admin::user', defaults({ populate: ['roles'] }, params));

return strapi.db.query('admin::user').findPage(query);
};
Expand Down
Expand Up @@ -4,7 +4,6 @@ import {
isOperatorOfType,
contentTypes,
relations,
convertQueryParams,
errors,
} from '@strapi/utils';
import type { Data, Modules, UID } from '@strapi/types';
Expand Down Expand Up @@ -382,7 +381,7 @@ export default {

const res = await strapi.db
.query(targetUid)
.findPage(convertQueryParams.transformParamsToQuery(targetUid, queryParams));
.findPage(strapi.get('query-params').transform(targetUid, queryParams));

ctx.body = {
...res,
Expand Down Expand Up @@ -453,7 +452,7 @@ export default {
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });

const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
...convertQueryParams.transformParamsToQuery(targetUid, permissionQuery),
...strapi.get('query-params').transform(targetUid, permissionQuery),
ordering: 'desc',
page: ctx.request.query.page,
pageSize: ctx.request.query.pageSize,
Expand Down
@@ -1,3 +1,5 @@
import { queryParams } from '@strapi/utils';

import createReleaseService from '../release';
import releaseCT from '../../content-types/release/schema';

Expand Down Expand Up @@ -55,6 +57,19 @@ const baseStrapiMock = {
log: {
info: jest.fn(),
},
get(name: string) {
if (name === 'query-params') {
const transformer = queryParams.createTransformer({
getModel(name: string) {
return strapi.getModel(name as any);
},
});

return {
transform: transformer.transformQueryParams,
};
}
},
};

global.strapi = {
Expand Down
16 changes: 5 additions & 11 deletions packages/core/content-releases/server/src/services/release.ts
@@ -1,4 +1,4 @@
import { setCreatorFields, errors, convertQueryParams } from '@strapi/utils';
import { setCreatorFields, errors } from '@strapi/utils';

import type { Core, Modules, Struct, Internal, UID } from '@strapi/types';

Expand Down Expand Up @@ -236,7 +236,7 @@ const createReleaseService = ({ strapi }: { strapi: Core.LoadedStrapi }) => {
},

async findOne(id: GetRelease.Request['params']['id'], query = {}) {
const dbQuery = convertQueryParams.transformParamsToQuery(RELEASE_MODEL_UID, query);
const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query);
const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({
...dbQuery,
where: { id },
Expand All @@ -246,7 +246,7 @@ const createReleaseService = ({ strapi }: { strapi: Core.LoadedStrapi }) => {
},

findPage(query?: GetReleases.Request['query']) {
const dbQuery = convertQueryParams.transformParamsToQuery(RELEASE_MODEL_UID, query ?? {});
const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query ?? {});

return strapi.db.query(RELEASE_MODEL_UID).findPage({
...dbQuery,
Expand Down Expand Up @@ -467,10 +467,7 @@ const createReleaseService = ({ strapi }: { strapi: Core.LoadedStrapi }) => {
throw new errors.NotFoundError(`No release found for id ${releaseId}`);
}

const dbQuery = convertQueryParams.transformParamsToQuery(
RELEASE_ACTION_MODEL_UID,
query ?? {}
);
const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});

return strapi.db.query(RELEASE_ACTION_MODEL_UID).findPage({
...dbQuery,
Expand All @@ -488,10 +485,7 @@ const createReleaseService = ({ strapi }: { strapi: Core.LoadedStrapi }) => {
async countActions(
query: Modules.EntityService.Params.Pick<typeof RELEASE_ACTION_MODEL_UID, 'filters'>
) {
const dbQuery = convertQueryParams.transformParamsToQuery(
RELEASE_ACTION_MODEL_UID,
query ?? {}
);
const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});

return strapi.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);
},
Expand Down
2 changes: 2 additions & 0 deletions packages/core/core/src/Strapi.ts
Expand Up @@ -25,6 +25,7 @@ import createWebhookRunner, { WebhookRunner } from './services/webhook-runner';
import { webhookModel, createWebhookStore } from './services/webhook-store';
import { createCoreStore, coreStoreModel } from './services/core-store';
import createEntityService from './services/entity-service';
import createQueryParamService from './services/query-params';

import createCronService from './services/cron';
import entityValidator from './services/entity-validator';
Expand Down Expand Up @@ -182,6 +183,7 @@ class Strapi extends Container implements Core.Strapi {
.add('apis', registries.apis(this))
.add('sanitizers', registries.sanitizers())
.add('validators', registries.validators())
.add('query-params', createQueryParamService(this))
.add('content-api', createContentAPI(this))
.add('auth', createAuth())
.add('models', registries.models());
Expand Down
@@ -1,6 +1,6 @@
import { omit, assoc, curry, merge } from 'lodash/fp';

import { async, convertQueryParams, contentTypes as contentTypesUtils } from '@strapi/utils';
import { async, contentTypes as contentTypesUtils } from '@strapi/utils';
import type { UID } from '@strapi/types';

import { wrapInTransaction, type RepositoryFactoryMethod } from './common';
Expand All @@ -24,7 +24,7 @@ import { getDeepPopulate } from './utils/populate';
import { transformData } from './transform/data';

const transformParamsToQuery = curry((uid: UID.Schema, params: any) => {
const query = convertQueryParams.transformParamsToQuery(uid, params);
const query = strapi.get('query-params').transform(uid, params);

return assoc('where', { ...params?.lookup, ...query.where }, query);
});
Expand Down
9 changes: 4 additions & 5 deletions packages/core/core/src/services/entity-service/index.ts
Expand Up @@ -5,13 +5,10 @@ import {
contentTypes as contentTypesUtils,
errors,
relations as relationUtils,
convertQueryParams,
} from '@strapi/utils';
import type { Database } from '@strapi/database';
import type { Core, Modules, Utils } from '@strapi/types';

const { transformParamsToQuery } = convertQueryParams;

type Decoratable<T> = T & {
decorate(
decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {
Expand All @@ -26,7 +23,9 @@ const transformLoadParamsToQuery = (
params: Record<string, unknown>,
pagination = {}
) => {
const query = transformParamsToQuery(uid, { populate: { [field]: params } as any }) as any;
const query = strapi
.get('query-params')
.transform(uid, { populate: { [field]: params } as any }) as any;

const res = {
...query.populate[field],
Expand Down Expand Up @@ -75,7 +74,7 @@ const createDefaultImplementation = ({
async findPage(uid, opts) {
const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });

const query = transformParamsToQuery(uid, wrappedParams);
const query = strapi.get('query-params').transform(uid, wrappedParams);

const entities = await db.query(uid).findPage(query);
return this.wrapResult(entities, { uid, action: 'findMany' });
Expand Down

0 comments on commit 6449ad5

Please sign in to comment.