feat(M08-C): 补会员检索与员工概况

This commit is contained in:
Codex
2026-08-10 10:35:44 +08:00
parent 8b46863cd8
commit 1b0839e881
22 changed files with 758 additions and 74 deletions
+52 -4
View File
@@ -11,9 +11,15 @@ const forbiddenToken = signAccessToken({
sub: '22', sid: '6c4d3af8-c63c-4edb-bf95-b84127bb3f6e',
tid: '7', aid: '9', rv: 1
}, secret, 900);
const managerToken = signAccessToken({
sub: '23', sid: '7c4d3af8-c63c-4edb-bf95-b84127bb3f6e',
tid: '7', aid: '9', rv: 1
}, secret, 900);
let profileInput;
let benefitsInput;
let memberListInput;
let memberDetailInput;
const app = await buildApp({
members: {
jwtSecret: secret,
@@ -25,7 +31,8 @@ const app = await buildApp({
platformAppId: '9',
expiresAt: new Date(Date.now() + 60000),
user: {
id: sessionId === '6c4d3af8-c63c-4edb-bf95-b84127bb3f6e' ? '22' : '21',
id: sessionId === '6c4d3af8-c63c-4edb-bf95-b84127bb3f6e' ? '22'
: sessionId === '7c4d3af8-c63c-4edb-bf95-b84127bb3f6e' ? '23' : '21',
tenantId: '7',
userType: 'CUSTOMER',
status: 'ACTIVE',
@@ -39,14 +46,28 @@ const app = await buildApp({
},
accessControl: {
async getAccessProfile(tenantId, userId) {
return userId === '21'
return userId === '23'
? { roles: ['STORE_ADMIN'], capabilities: ['user.read'], storeIds: ['11'] }
: userId === '21'
? { roles: ['CUSTOMER'], capabilities: ['profile.read', 'order.self.read'], storeIds: [] }
: { roles: ['CUSTOMER'], capabilities: ['order.self.read'], storeIds: [] };
}
},
service: {
async listMembers() { throw new Error('not called'); },
async getMember() { throw new Error('not called'); },
async listMembers(input) {
memberListInput = input;
return {
items: [{
memberId: '31', nickname: '门店会员', maskedPhone: '138****8000',
wallet: { totalBalanceCents: 1200 }, orders: { orderCount: 2 }
}],
total: 1
};
},
async getMember(input) {
memberDetailInput = input;
return { memberId: input.memberId, nickname: '门店会员', recentLedger: [] };
},
async getMyBenefits(input) {
benefitsInput = input;
return {
@@ -100,6 +121,33 @@ assert.equal(benefitsInput.userId, '21');
assert.equal(benefits.json().data.coupons[0].couponGrantId, '401');
assert.equal(benefits.json().data.packages[0].packageHoldingId, '501');
const members = await app.inject({
method: 'GET',
url: '/app-api/management/members?page=1&pageSize=20&status=ACTIVE&search=138',
headers: { authorization: `Bearer ${managerToken}` }
});
assert.equal(members.statusCode, 200);
assert.equal(memberListInput.actor.userId, '23');
assert.deepEqual(memberListInput.actor.access.storeIds, ['11']);
assert.equal(memberListInput.status, 'ACTIVE');
assert.equal(memberListInput.search, '138');
assert.equal(members.json().data.items[0].memberId, '31');
const memberDetail = await app.inject({
method: 'GET',
url: '/app-api/management/members/31',
headers: { authorization: `Bearer ${managerToken}` }
});
assert.equal(memberDetail.statusCode, 200);
assert.equal(memberDetailInput.memberId, '31');
const memberForbidden = await app.inject({
method: 'GET',
url: '/app-api/management/members',
headers: { authorization: `Bearer ${token}` }
});
assert.equal(memberForbidden.statusCode, 403);
const unauthorized = await app.inject({
method: 'GET',
url: '/app-api/profile'