Bài viết


Phân trang cho danh sách user trong Strapi

Ngày đăng: 09/10/2024

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.


1. Custom method find trong file strapi-server.js


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
}



2. Gọi api truy vấn danh sách user ở front-end


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 đó:

  • requestAuth là hàm xử lý call api với axios của riêng bạn


Vậy là đã có thể phân trang nhanh chóng cho danh sách user rồi nhé!


3. Sử dụng policies cho users-permission extension

Để á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.


Liên hệ ngay tại đây với chúng tôi để được tư vấn nhanh nhất hoặc liên hệ:

Hotline: 0705.550.553

Email: bqsoftvn@gmail.com

Fanpage: https://www.facebook.com/bqsoftvn


Hân hạnh được hợp tác!

icon zalo
icon-mess