Hiện tại ở version 4.x.x thì Strapi chưa hỗ trợ phân trang cho danh sách user, để làm được thì chúng ta cần phải custom thủ công method find trong extension users-permissions.
File: /src/extensions/users-permissions/strapi-server.js
// @ts-nocheck
'use strict';
// @ts-nocheck
const utils = require("@strapi/utils");
const { sanitize } = utils;
const {
getPaginationInfo,
transformPaginationResponse,
convertPagedToStartLimit
} = require("../../../node_modules/@strapi/strapi/dist/core-api/service/pagination");
const { contentAPI } = sanitize;
const uid = "plugin::users-permissions.user";
const sanitizeQuery = async (ctx) => {
const contentType = strapi.contentType(uid)
return await contentAPI.input(ctx.query, contentType, ctx.state.auth)
};
const sanitizeOutput = async (user, ctx) => {
const schema = strapi.getModel(uid);
const { auth } = ctx.state;
return sanitize.contentAPI.output(user, schema, { auth });
};
module.exports = (plugin) => {
plugin.controllers.user.find = async (ctx) => {
const sanitizedQuery = await sanitizeQuery(ctx);
// @ts-ignore
const { pagination = {}, ...restOfCtxQueries } = sanitizedQuery;
const queryPagination = convertPagedToStartLimit(pagination);
const params = {
...restOfCtxQueries,
limit: queryPagination.limit,
offset: queryPagination.start
};
const [users, count] = await strapi.db.query(uid).findWithCount(params);
const paginationInfo = getPaginationInfo(sanitizedQuery);
const paginationResult = transformPaginationResponse(
paginationInfo,
count
);
let data = await Promise.all(
users.map((user) => sanitizeOutput(user, ctx))
);
ctx.body = {
data: data,
meta: {
pagination: paginationResult,
},
};
};
return plugin
}
import { useQuery } from "react-query";
import qs from 'qs';
const getUsers = async (params) => {
const query = qs.stringify(params);
return requestAuth.get(`users?${query}`);
}
const { data, isLoading, isFetching }
= useQuery({
queryKey: ['accounts'],
queryFn: () => {
return getUsers({
pagination: {
start: 0,
limit: 10,
},
populate: {
role: "*"
}
})
},
onSuccess: () => {
},
onError: () => {
}
})
Trong đó:
Vậy là đã có thể phân trang nhanh chóng cho danh sách user rồi nhé!
Để áp dụng policies cho users-permission extension thì ta sẽ thêm code sau vào file strapi-server.js
File: /src/extensions/users-permissions/strapi-server.js
module.exports = (plugin) => {
plugin.routes["content-api"].routes = plugin.routes["content-api"].routes.map(item => {
if ((item.method == "POST" || item.method == "PUT" || item.method == "DELETE") && item.path.includes('/users')) {
item.config.policies = [
"global::name_policies",
];
}
return item;
})
return plugin;
}
Ở đây ta check nếu thêm mới, cập nhật hoặc xoá user thì phải áp dụng global policies tên là name_policies.