cnpmcore 3.77.0 → 3.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ import { AbstractService } from '../../common/AbstractService';
2
+ import { Org } from '../entity/Org';
3
+ import { OrgMember } from '../entity/OrgMember';
4
+ export interface CreateOrgCmd {
5
+ name: string;
6
+ description?: string;
7
+ creatorUserId: string;
8
+ }
9
+ export declare class OrgService extends AbstractService {
10
+ private readonly orgRepository;
11
+ private readonly teamRepository;
12
+ createOrg(cmd: CreateOrgCmd): Promise<Org>;
13
+ removeOrg(orgId: string): Promise<void>;
14
+ findOrgByName(name: string): Promise<Org | null>;
15
+ addMember(orgId: string, userId: string, role?: 'owner' | 'member'): Promise<OrgMember>;
16
+ removeMember(orgId: string, userId: string): Promise<void>;
17
+ listMembers(orgId: string): Promise<OrgMember[]>;
18
+ requiredOrgOwnerOrAdmin(orgId: string, userId: string, isAdmin: boolean): Promise<void>;
19
+ }
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.OrgService = void 0;
13
+ const tegg_1 = require("@eggjs/tegg");
14
+ const egg_errors_1 = require("egg-errors");
15
+ const AbstractService_1 = require("../../common/AbstractService");
16
+ const constants_1 = require("../../common/constants");
17
+ const OrgRepository_1 = require("../../repository/OrgRepository");
18
+ const TeamRepository_1 = require("../../repository/TeamRepository");
19
+ const Org_1 = require("../entity/Org");
20
+ const OrgMember_1 = require("../entity/OrgMember");
21
+ const Team_1 = require("../entity/Team");
22
+ const TeamMember_1 = require("../entity/TeamMember");
23
+ let OrgService = class OrgService extends AbstractService_1.AbstractService {
24
+ async createOrg(cmd) {
25
+ const existing = await this.orgRepository.findOrgByName(cmd.name);
26
+ if (existing) {
27
+ throw new egg_errors_1.ForbiddenError(`Org "${cmd.name}" already exists`);
28
+ }
29
+ // Create org + developers team + owner + team member in one transaction
30
+ const org = Org_1.Org.create({
31
+ name: cmd.name,
32
+ description: cmd.description,
33
+ });
34
+ const developersTeam = Team_1.Team.create({
35
+ orgId: org.orgId,
36
+ name: constants_1.DEVELOPERS_TEAM,
37
+ description: 'default team',
38
+ });
39
+ const ownerMember = OrgMember_1.OrgMember.create({
40
+ orgId: org.orgId,
41
+ userId: cmd.creatorUserId,
42
+ role: 'owner',
43
+ });
44
+ const teamMember = TeamMember_1.TeamMember.create({
45
+ teamId: developersTeam.teamId,
46
+ userId: cmd.creatorUserId,
47
+ });
48
+ await this.orgRepository.createOrgCascade(org, developersTeam, ownerMember, teamMember);
49
+ this.logger.info('[OrgService:createOrg] orgId: %s, name: %s, creatorUserId: %s', org.orgId, org.name, cmd.creatorUserId);
50
+ return org;
51
+ }
52
+ async removeOrg(orgId) {
53
+ await this.orgRepository.removeOrgCascade(orgId);
54
+ this.logger.info('[OrgService:removeOrg] orgId: %s', orgId);
55
+ }
56
+ async findOrgByName(name) {
57
+ return await this.orgRepository.findOrgByName(name);
58
+ }
59
+ async addMember(orgId, userId, role = 'member') {
60
+ const org = await this.orgRepository.findOrgByOrgId(orgId);
61
+ if (!org) {
62
+ throw new egg_errors_1.NotFoundError('Org not found');
63
+ }
64
+ // Upsert org member
65
+ let member = await this.orgRepository.findMember(orgId, userId);
66
+ if (member) {
67
+ member.role = role;
68
+ await this.orgRepository.saveMember(member);
69
+ }
70
+ else {
71
+ member = OrgMember_1.OrgMember.create({ orgId, userId, role });
72
+ await this.orgRepository.saveMember(member);
73
+ }
74
+ // Auto-add to developers team
75
+ const developersTeam = await this.teamRepository.findTeam(orgId, constants_1.DEVELOPERS_TEAM);
76
+ if (developersTeam) {
77
+ const existingTeamMember = await this.teamRepository.findMember(developersTeam.teamId, userId);
78
+ if (!existingTeamMember) {
79
+ const teamMember = TeamMember_1.TeamMember.create({
80
+ teamId: developersTeam.teamId,
81
+ userId,
82
+ });
83
+ await this.teamRepository.addMember(teamMember);
84
+ }
85
+ }
86
+ this.logger.info('[OrgService:addMember] orgId: %s, userId: %s, role: %s', orgId, userId, role);
87
+ return member;
88
+ }
89
+ async removeMember(orgId, userId) {
90
+ // Remove from all teams in this org
91
+ await this.teamRepository.removeMemberFromAllTeams(orgId, userId);
92
+ // Remove from org
93
+ await this.orgRepository.removeMember(orgId, userId);
94
+ this.logger.info('[OrgService:removeMember] orgId: %s, userId: %s', orgId, userId);
95
+ }
96
+ async listMembers(orgId) {
97
+ return await this.orgRepository.listMembers(orgId);
98
+ }
99
+ async requiredOrgOwnerOrAdmin(orgId, userId, isAdmin) {
100
+ if (isAdmin)
101
+ return;
102
+ const member = await this.orgRepository.findMember(orgId, userId);
103
+ if (!member || member.role !== 'owner') {
104
+ throw new egg_errors_1.ForbiddenError('Only org owner or admin can perform this action');
105
+ }
106
+ }
107
+ };
108
+ exports.OrgService = OrgService;
109
+ __decorate([
110
+ (0, tegg_1.Inject)(),
111
+ __metadata("design:type", OrgRepository_1.OrgRepository)
112
+ ], OrgService.prototype, "orgRepository", void 0);
113
+ __decorate([
114
+ (0, tegg_1.Inject)(),
115
+ __metadata("design:type", TeamRepository_1.TeamRepository)
116
+ ], OrgService.prototype, "teamRepository", void 0);
117
+ exports.OrgService = OrgService = __decorate([
118
+ (0, tegg_1.SingletonProto)({
119
+ accessLevel: tegg_1.AccessLevel.PUBLIC,
120
+ })
121
+ ], OrgService);
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3JnU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FwcC9jb3JlL3NlcnZpY2UvT3JnU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FJcUI7QUFDckIsMkNBQTJEO0FBQzNELGtFQUErRDtBQUMvRCxzREFBeUQ7QUFDekQsa0VBQStEO0FBQy9ELG9FQUFpRTtBQUNqRSx1Q0FBb0M7QUFDcEMsbURBQWdEO0FBQ2hELHlDQUFzQztBQUN0QyxxREFBa0Q7QUFXM0MsSUFBTSxVQUFVLEdBQWhCLE1BQU0sVUFBVyxTQUFRLGlDQUFlO0lBTzdDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBaUI7UUFDL0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLElBQUksMkJBQWMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7U0FDOUQ7UUFFRCx3RUFBd0U7UUFDeEUsTUFBTSxHQUFHLEdBQUcsU0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNyQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxjQUFjLEdBQUcsV0FBSSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDaEIsSUFBSSxFQUFFLDJCQUFlO1lBQ3JCLFdBQVcsRUFBRSxjQUFjO1NBQzVCLENBQUMsQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLHFCQUFTLENBQUMsTUFBTSxDQUFDO1lBQ25DLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztZQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLGFBQWE7WUFDekIsSUFBSSxFQUFFLE9B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
@@ -0,0 +1,16 @@
1
+ import { AbstractService } from '../../common/AbstractService';
2
+ import { Team } from '../entity/Team';
3
+ import { TeamMember } from '../entity/TeamMember';
4
+ import { TeamPackage } from '../entity/TeamPackage';
5
+ export declare class TeamService extends AbstractService {
6
+ private readonly orgRepository;
7
+ private readonly teamRepository;
8
+ createTeam(orgId: string, name: string, description?: string): Promise<Team>;
9
+ removeTeam(teamId: string): Promise<void>;
10
+ addMember(teamId: string, userId: string): Promise<TeamMember>;
11
+ removeMember(teamId: string, userId: string): Promise<void>;
12
+ listMembers(teamId: string): Promise<TeamMember[]>;
13
+ grantPackageAccess(teamId: string, packageId: string): Promise<TeamPackage>;
14
+ revokePackageAccess(teamId: string, packageId: string): Promise<void>;
15
+ listPackages(teamId: string): Promise<TeamPackage[]>;
16
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TeamService = void 0;
13
+ const tegg_1 = require("@eggjs/tegg");
14
+ const egg_errors_1 = require("egg-errors");
15
+ const AbstractService_1 = require("../../common/AbstractService");
16
+ const constants_1 = require("../../common/constants");
17
+ const OrgRepository_1 = require("../../repository/OrgRepository");
18
+ const TeamRepository_1 = require("../../repository/TeamRepository");
19
+ const Team_1 = require("../entity/Team");
20
+ const TeamMember_1 = require("../entity/TeamMember");
21
+ const TeamPackage_1 = require("../entity/TeamPackage");
22
+ let TeamService = class TeamService extends AbstractService_1.AbstractService {
23
+ async createTeam(orgId, name, description) {
24
+ const existing = await this.teamRepository.findTeam(orgId, name);
25
+ if (existing) {
26
+ throw new egg_errors_1.ForbiddenError(`Team "${name}" already exists`);
27
+ }
28
+ const team = Team_1.Team.create({
29
+ orgId,
30
+ name,
31
+ description,
32
+ });
33
+ await this.teamRepository.saveTeam(team);
34
+ this.logger.info('[TeamService:createTeam] teamId: %s, orgId: %s, name: %s', team.teamId, orgId, name);
35
+ return team;
36
+ }
37
+ async removeTeam(teamId) {
38
+ const team = await this.teamRepository.findTeamByTeamId(teamId);
39
+ if (!team) {
40
+ throw new egg_errors_1.NotFoundError('Team not found');
41
+ }
42
+ if (team.name === constants_1.DEVELOPERS_TEAM) {
43
+ throw new egg_errors_1.ForbiddenError('Cannot delete the developers team');
44
+ }
45
+ // Cascade: remove packages + members + team in one transaction
46
+ await this.teamRepository.removeTeamCascade(teamId);
47
+ this.logger.info('[TeamService:removeTeam] teamId: %s', teamId);
48
+ }
49
+ async addMember(teamId, userId) {
50
+ const team = await this.teamRepository.findTeamByTeamId(teamId);
51
+ if (!team) {
52
+ throw new egg_errors_1.NotFoundError('Team not found');
53
+ }
54
+ // Must be an org member
55
+ const orgMember = await this.orgRepository.findMember(team.orgId, userId);
56
+ if (!orgMember) {
57
+ throw new egg_errors_1.ForbiddenError('User must be an org member before joining a team');
58
+ }
59
+ const existing = await this.teamRepository.findMember(teamId, userId);
60
+ if (existing) {
61
+ return existing;
62
+ }
63
+ const member = TeamMember_1.TeamMember.create({ teamId, userId });
64
+ await this.teamRepository.addMember(member);
65
+ this.logger.info('[TeamService:addMember] teamId: %s, userId: %s', teamId, userId);
66
+ return member;
67
+ }
68
+ async removeMember(teamId, userId) {
69
+ await this.teamRepository.removeMember(teamId, userId);
70
+ this.logger.info('[TeamService:removeMember] teamId: %s, userId: %s', teamId, userId);
71
+ }
72
+ async listMembers(teamId) {
73
+ return await this.teamRepository.listMembers(teamId);
74
+ }
75
+ async grantPackageAccess(teamId, packageId) {
76
+ const team = await this.teamRepository.findTeamByTeamId(teamId);
77
+ if (!team) {
78
+ throw new egg_errors_1.NotFoundError('Team not found');
79
+ }
80
+ const existing = await this.teamRepository.findPackage(teamId, packageId);
81
+ if (existing) {
82
+ return existing;
83
+ }
84
+ const teamPackage = TeamPackage_1.TeamPackage.create({ teamId, packageId });
85
+ await this.teamRepository.addPackage(teamPackage);
86
+ this.logger.info('[TeamService:grantPackageAccess] teamId: %s, packageId: %s', teamId, packageId);
87
+ return teamPackage;
88
+ }
89
+ async revokePackageAccess(teamId, packageId) {
90
+ await this.teamRepository.removePackage(teamId, packageId);
91
+ this.logger.info('[TeamService:revokePackageAccess] teamId: %s, packageId: %s', teamId, packageId);
92
+ }
93
+ async listPackages(teamId) {
94
+ return await this.teamRepository.listPackages(teamId);
95
+ }
96
+ };
97
+ exports.TeamService = TeamService;
98
+ __decorate([
99
+ (0, tegg_1.Inject)(),
100
+ __metadata("design:type", OrgRepository_1.OrgRepository)
101
+ ], TeamService.prototype, "orgRepository", void 0);
102
+ __decorate([
103
+ (0, tegg_1.Inject)(),
104
+ __metadata("design:type", TeamRepository_1.TeamRepository)
105
+ ], TeamService.prototype, "teamRepository", void 0);
106
+ exports.TeamService = TeamService = __decorate([
107
+ (0, tegg_1.SingletonProto)({
108
+ accessLevel: tegg_1.AccessLevel.PUBLIC,
109
+ })
110
+ ], TeamService);
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVhbVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcHAvY29yZS9zZXJ2aWNlL1RlYW1TZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNDQUlxQjtBQUNyQiwyQ0FBMkQ7QUFDM0Qsa0VBQStEO0FBQy9ELHNEQUF5RDtBQUN6RCxrRUFBK0Q7QUFDL0Qsb0VBQWlFO0FBQ2pFLHlDQUFzQztBQUN0QyxxREFBa0Q7QUFDbEQsdURBQW9EO0FBSzdDLElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVksU0FBUSxpQ0FBZTtJQU85QyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsV0FBb0I7UUFDaEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLElBQUksMkJBQWMsQ0FBQyxTQUFTLElBQUksa0JBQWtCLENBQUMsQ0FBQztTQUMzRDtRQUVELE1BQU0sSUFBSSxHQUFHLFdBQUksQ0FBQyxNQUFNLENBQUM7WUFDdkIsS0FBSztZQUNMLElBQUk7WUFDSixXQUFXO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwREFBMEQsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksMEJBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLDJCQUFlLEVBQUU7WUFDakMsTUFBTSxJQUFJLDJCQUFjLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUMvRDtRQUNELCtEQUErRDtRQUMvRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksMEJBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsd0JBQXdCO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsTUFBTSxJQUFJLDJCQUFjLENBQUMsa0RBQWtELENBQUMsQ0FBQztTQUM5RTtRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLElBQUksUUFBUSxFQUFFO1lBQ1osT0FBTyxRQUFRLENBQUM7U0FDakI7UUFFRCxNQUFNLE1BQU0sR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25GLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQy9DLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxTQUFpQjtRQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE1BQU0sSUFBSSwwQkFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDM0M7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxJQUFJLFFBQVEsRUFBRTtZQUNaLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxXQUFXLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM5RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDREQUE0RCxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxTQUFpQjtRQUN6RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw2REFBNkQsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYztRQUMvQixPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGLENBQUE7QUE3Rlksa0NBQVc7QUFFTDtJQURoQixJQUFBLGFBQU0sR0FBRTs4QkFDdUIsNkJBQWE7a0RBQUM7QUFHN0I7SUFEaEIsSUFBQSxhQUFNLEdBQUU7OEJBQ3dCLCtCQUFjO21EQUFDO3NCQUxyQyxXQUFXO0lBSHZCLElBQUEscUJBQWMsRUFBQztRQUNkLFdBQVcsRUFBRSxrQkFBVyxDQUFDLE1BQU07S0FDaEMsQ0FBQztHQUNXLFdBQVcsQ0E2RnZCIn0=
@@ -0,0 +1,34 @@
1
+ import { EggContext } from '@eggjs/tegg';
2
+ import { AbstractController } from './AbstractController';
3
+ export declare class OrgController extends AbstractController {
4
+ private readonly orgService;
5
+ private readonly teamRepository;
6
+ createOrg(ctx: EggContext, body: {
7
+ name: string;
8
+ description?: string;
9
+ }): Promise<{
10
+ ok: boolean;
11
+ }>;
12
+ showOrg(ctx: EggContext, orgName: string): Promise<{
13
+ name: string;
14
+ description: string;
15
+ created: Date;
16
+ }>;
17
+ removeOrg(ctx: EggContext, orgName: string): Promise<{
18
+ ok: boolean;
19
+ }>;
20
+ listMembers(ctx: EggContext, orgName: string): Promise<Record<string, string>>;
21
+ addMember(ctx: EggContext, orgName: string, body: {
22
+ user: string;
23
+ role?: 'owner' | 'member';
24
+ }): Promise<{
25
+ ok: boolean;
26
+ }>;
27
+ removeMember(ctx: EggContext, orgName: string, username: string): Promise<{
28
+ ok: boolean;
29
+ }>;
30
+ listUserTeams(ctx: EggContext, orgName: string, username: string): Promise<{
31
+ name: string;
32
+ description: string;
33
+ }[]>;
34
+ }
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.OrgController = void 0;
16
+ const tegg_1 = require("@eggjs/tegg");
17
+ const egg_errors_1 = require("egg-errors");
18
+ const AbstractController_1 = require("./AbstractController");
19
+ const AdminAccess_1 = require("../middleware/AdminAccess");
20
+ const OrgService_1 = require("../../core/service/OrgService");
21
+ const TeamRepository_1 = require("../../repository/TeamRepository");
22
+ let OrgController = class OrgController extends AbstractController_1.AbstractController {
23
+ // PUT /-/org — Admin only
24
+ async createOrg(ctx, body) {
25
+ const authorizedUser = await this.userRoleManager.requiredAuthorizedUser(ctx, 'setting');
26
+ if (!body.name) {
27
+ throw new egg_errors_1.UnprocessableEntityError('name is required');
28
+ }
29
+ await this.orgService.createOrg({
30
+ name: body.name,
31
+ description: body.description,
32
+ creatorUserId: authorizedUser.userId,
33
+ });
34
+ return { ok: true };
35
+ }
36
+ // GET /-/org/:orgName
37
+ async showOrg(ctx, orgName) {
38
+ await this.userRoleManager.requiredAuthorizedUser(ctx, 'read');
39
+ const org = await this.orgService.findOrgByName(orgName);
40
+ if (!org) {
41
+ throw new egg_errors_1.NotFoundError(`Org "${orgName}" not found`);
42
+ }
43
+ return {
44
+ name: org.name,
45
+ description: org.description,
46
+ created: org.createdAt,
47
+ };
48
+ }
49
+ // DELETE /-/org/:orgName — Admin only
50
+ async removeOrg(ctx, orgName) {
51
+ await this.userRoleManager.requiredAuthorizedUser(ctx, 'setting');
52
+ const org = await this.orgService.findOrgByName(orgName);
53
+ if (!org) {
54
+ throw new egg_errors_1.NotFoundError(`Org "${orgName}" not found`);
55
+ }
56
+ await this.orgService.removeOrg(org.orgId);
57
+ return { ok: true };
58
+ }
59
+ // GET /-/org/:orgName/member — npm org ls
60
+ async listMembers(ctx, orgName) {
61
+ await this.userRoleManager.requiredAuthorizedUser(ctx, 'read');
62
+ const org = await this.orgService.findOrgByName(orgName);
63
+ if (!org) {
64
+ throw new egg_errors_1.NotFoundError(`Org "${orgName}" not found`);
65
+ }
66
+ const members = await this.orgService.listMembers(org.orgId);
67
+ const users = await this.userRepository.findUsersByUserIds(members.map(m => m.userId));
68
+ const userMap = new Map(users.map(u => [u.userId, u]));
69
+ const result = {};
70
+ for (const member of members) {
71
+ const user = userMap.get(member.userId);
72
+ if (user) {
73
+ result[user.name] = member.role;
74
+ }
75
+ }
76
+ return result;
77
+ }
78
+ // PUT /-/org/:orgName/member — npm org set
79
+ async addMember(ctx, orgName, body) {
80
+ const authorizedUser = await this.userRoleManager.requiredAuthorizedUser(ctx, 'setting');
81
+ const org = await this.orgService.findOrgByName(orgName);
82
+ if (!org) {
83
+ throw new egg_errors_1.NotFoundError(`Org "${orgName}" not found`);
84
+ }
85
+ const isAdmin = await this.userRoleManager.isAdmin(ctx);
86
+ await this.orgService.requiredOrgOwnerOrAdmin(org.orgId, authorizedUser.userId, isAdmin);
87
+ if (!body.user) {
88
+ throw new egg_errors_1.UnprocessableEntityError('user is required');
89
+ }
90
+ const targetUser = await this.userRepository.findUserByName(body.user);
91
+ if (!targetUser) {
92
+ throw new egg_errors_1.NotFoundError(`User "${body.user}" not found`);
93
+ }
94
+ await this.orgService.addMember(org.orgId, targetUser.userId, body.role || 'member');
95
+ return { ok: true };
96
+ }
97
+ // DELETE /-/org/:orgName/member/:username — npm org rm
98
+ async removeMember(ctx, orgName, username) {
99
+ const authorizedUser = await this.userRoleManager.requiredAuthorizedUser(ctx, 'setting');
100
+ const org = await this.orgService.findOrgByName(orgName);
101
+ if (!org) {
102
+ throw new egg_errors_1.NotFoundError(`Org "${orgName}" not found`);
103
+ }
104
+ const isAdmin = await this.userRoleManager.isAdmin(ctx);
105
+ await this.orgService.requiredOrgOwnerOrAdmin(org.orgId, authorizedUser.userId, isAdmin);
106
+ const targetUser = await this.userRepository.findUserByName(username);
107
+ if (!targetUser) {
108
+ throw new egg_errors_1.NotFoundError(`User "${username}" not found`);
109
+ }
110
+ await this.orgService.removeMember(org.orgId, targetUser.userId);
111
+ return { ok: true };
112
+ }
113
+ // GET /-/org/:orgName/member/:username/team
114
+ async listUserTeams(ctx, orgName, username) {
115
+ await this.userRoleManager.requiredAuthorizedUser(ctx, 'read');
116
+ const org = await this.orgService.findOrgByName(orgName);
117
+ if (!org) {
118
+ throw new egg_errors_1.NotFoundError(`Org "${orgName}" not found`);
119
+ }
120
+ const targetUser = await this.userRepository.findUserByName(username);
121
+ if (!targetUser) {
122
+ throw new egg_errors_1.NotFoundError(`User "${username}" not found`);
123
+ }
124
+ const teams = await this.teamRepository.listTeamsByUserIdAndOrgId(targetUser.userId, org.orgId);
125
+ return teams.map(t => ({ name: t.name, description: t.description }));
126
+ }
127
+ };
128
+ exports.OrgController = OrgController;
129
+ __decorate([
130
+ (0, tegg_1.Inject)(),
131
+ __metadata("design:type", OrgService_1.OrgService)
132
+ ], OrgController.prototype, "orgService", void 0);
133
+ __decorate([
134
+ (0, tegg_1.Inject)(),
135
+ __metadata("design:type", TeamRepository_1.TeamRepository)
136
+ ], OrgController.prototype, "teamRepository", void 0);
137
+ __decorate([
138
+ (0, tegg_1.HTTPMethod)({
139
+ path: '/-/org',
140
+ method: tegg_1.HTTPMethodEnum.PUT,
141
+ }),
142
+ (0, tegg_1.Middleware)(AdminAccess_1.AdminAccess),
143
+ __param(0, (0, tegg_1.Context)()),
144
+ __param(1, (0, tegg_1.HTTPBody)()),
145
+ __metadata("design:type", Function),
146
+ __metadata("design:paramtypes", [Object, Object]),
147
+ __metadata("design:returntype", Promise)
148
+ ], OrgController.prototype, "createOrg", null);
149
+ __decorate([
150
+ (0, tegg_1.HTTPMethod)({
151
+ path: '/-/org/:orgName',
152
+ method: tegg_1.HTTPMethodEnum.GET,
153
+ }),
154
+ __param(0, (0, tegg_1.Context)()),
155
+ __param(1, (0, tegg_1.HTTPParam)()),
156
+ __metadata("design:type", Function),
157
+ __metadata("design:paramtypes", [Object, String]),
158
+ __metadata("design:returntype", Promise)
159
+ ], OrgController.prototype, "showOrg", null);
160
+ __decorate([
161
+ (0, tegg_1.HTTPMethod)({
162
+ path: '/-/org/:orgName',
163
+ method: tegg_1.HTTPMethodEnum.DELETE,
164
+ }),
165
+ (0, tegg_1.Middleware)(AdminAccess_1.AdminAccess),
166
+ __param(0, (0, tegg_1.Context)()),
167
+ __param(1, (0, tegg_1.HTTPParam)()),
168
+ __metadata("design:type", Function),
169
+ __metadata("design:paramtypes", [Object, String]),
170
+ __metadata("design:returntype", Promise)
171
+ ], OrgController.prototype, "removeOrg", null);
172
+ __decorate([
173
+ (0, tegg_1.HTTPMethod)({
174
+ path: '/-/org/:orgName/member',
175
+ method: tegg_1.HTTPMethodEnum.GET,
176
+ }),
177
+ __param(0, (0, tegg_1.Context)()),
178
+ __param(1, (0, tegg_1.HTTPParam)()),
179
+ __metadata("design:type", Function),
180
+ __metadata("design:paramtypes", [Object, String]),
181
+ __metadata("design:returntype", Promise)
182
+ ], OrgController.prototype, "listMembers", null);
183
+ __decorate([
184
+ (0, tegg_1.HTTPMethod)({
185
+ path: '/-/org/:orgName/member',
186
+ method: tegg_1.HTTPMethodEnum.PUT,
187
+ }),
188
+ __param(0, (0, tegg_1.Context)()),
189
+ __param(1, (0, tegg_1.HTTPParam)()),
190
+ __param(2, (0, tegg_1.HTTPBody)()),
191
+ __metadata("design:type", Function),
192
+ __metadata("design:paramtypes", [Object, String, Object]),
193
+ __metadata("design:returntype", Promise)
194
+ ], OrgController.prototype, "addMember", null);
195
+ __decorate([
196
+ (0, tegg_1.HTTPMethod)({
197
+ path: '/-/org/:orgName/member/:username',
198
+ method: tegg_1.HTTPMethodEnum.DELETE,
199
+ }),
200
+ __param(0, (0, tegg_1.Context)()),
201
+ __param(1, (0, tegg_1.HTTPParam)()),
202
+ __param(2, (0, tegg_1.HTTPParam)()),
203
+ __metadata("design:type", Function),
204
+ __metadata("design:paramtypes", [Object, String, String]),
205
+ __metadata("design:returntype", Promise)
206
+ ], OrgController.prototype, "removeMember", null);
207
+ __decorate([
208
+ (0, tegg_1.HTTPMethod)({
209
+ path: '/-/org/:orgName/member/:username/team',
210
+ method: tegg_1.HTTPMethodEnum.GET,
211
+ }),
212
+ __param(0, (0, tegg_1.Context)()),
213
+ __param(1, (0, tegg_1.HTTPParam)()),
214
+ __param(2, (0, tegg_1.HTTPParam)()),
215
+ __metadata("design:type", Function),
216
+ __metadata("design:paramtypes", [Object, String, String]),
217
+ __metadata("design:returntype", Promise)
218
+ ], OrgController.prototype, "listUserTeams", null);
219
+ exports.OrgController = OrgController = __decorate([
220
+ (0, tegg_1.HTTPController)()
221
+ ], OrgController);
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3JnQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FwcC9wb3J0L2NvbnRyb2xsZXIvT3JnQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FVcUI7QUFDckIsMkNBQXFFO0FBQ3JFLDZEQUEwRDtBQUMxRCwyREFBd0Q7QUFDeEQsOERBQTJEO0FBQzNELG9FQUFpRTtBQUcxRCxJQUFNLGFBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsdUNBQWtCO0lBT25ELDBCQUEwQjtJQU1wQixBQUFOLEtBQUssQ0FBQyxTQUFTLENBQVksR0FBZSxFQUFjLElBQTRDO1FBQ2xHLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxNQUFNLElBQUkscUNBQXdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUN4RDtRQUNELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLGFBQWEsRUFBRSxjQUFjLENBQUMsTUFBTTtTQUNyQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxzQkFBc0I7SUFLaEIsQUFBTixLQUFLLENBQUMsT0FBTyxDQUFZLEdBQWUsRUFBZSxPQUFlO1FBQ3BFLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FB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
@@ -0,0 +1,45 @@
1
+ import { EggContext } from '@eggjs/tegg';
2
+ import { AbstractController } from './AbstractController';
3
+ export declare class TeamController extends AbstractController {
4
+ private readonly orgService;
5
+ private readonly teamService;
6
+ private readonly teamRepository;
7
+ private requireOrgWriteAccess;
8
+ private requireTeamWriteAccess;
9
+ createTeam(ctx: EggContext, orgName: string, body: {
10
+ name: string;
11
+ description?: string;
12
+ }): Promise<{
13
+ ok: boolean;
14
+ }>;
15
+ listTeams(ctx: EggContext, orgName: string): Promise<{
16
+ name: string;
17
+ description: string;
18
+ }[]>;
19
+ showTeam(ctx: EggContext, orgName: string, teamName: string): Promise<{
20
+ name: string;
21
+ description: string;
22
+ created: Date;
23
+ }>;
24
+ removeTeam(ctx: EggContext, orgName: string, teamName: string): Promise<{
25
+ ok: boolean;
26
+ }>;
27
+ listTeamMembers(ctx: EggContext, orgName: string, teamName: string): Promise<string[]>;
28
+ addTeamMember(ctx: EggContext, orgName: string, teamName: string, body: {
29
+ user: string;
30
+ }): Promise<{
31
+ ok: boolean;
32
+ }>;
33
+ removeTeamMember(ctx: EggContext, orgName: string, teamName: string, username: string): Promise<{
34
+ ok: boolean;
35
+ }>;
36
+ listTeamPackages(ctx: EggContext, orgName: string, teamName: string): Promise<Record<string, string>>;
37
+ grantPackageAccess(ctx: EggContext, orgName: string, teamName: string, body: {
38
+ package: string;
39
+ }): Promise<{
40
+ ok: boolean;
41
+ }>;
42
+ revokePackageAccess(ctx: EggContext, orgName: string, teamName: string, scope: string, name: string): Promise<{
43
+ ok: boolean;
44
+ }>;
45
+ }