Skip to content

Commit 6f4be27

Browse files
authored
Merge pull request #1465 from credebl/feat/generate-token-for-client
Feat/generate token for client
2 parents a8dff91 + 42eca11 commit 6f4be27

14 files changed

Lines changed: 256 additions & 139 deletions

File tree

.husky/pre-push

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ while read local_ref local_sha remote_ref remote_sha; do
2828
echo "${CYAN}ℹ️ Skipping merge commit $commit${RESET}"
2929
continue
3030
fi
31-
32-
sig_status=$(git log --format='%G?' -n 1 $commit)
33-
31+
sig_status=$(git log --format='%G?' -n 1 $commit)
3432
# Currently only check for "N" - for no signature.
3533
if [ "$sig_status" = "N" ]; then
3634
unsigned_commits="$unsigned_commits $commit"
@@ -64,7 +62,6 @@ while read local_ref local_sha remote_ref remote_sha; do
6462
echo "${YELLOW}You can manually sign commits using:${RESET}"
6563
echo
6664
# Latest commit (HEAD)
67-
head_commit=$(git rev-parse HEAD)
6865
echo " - For the latest commit (HEAD):"
6966
echo " git commit --amend -sS --no-edit"
7067
echo
@@ -75,7 +72,6 @@ while read local_ref local_sha remote_ref remote_sha; do
7572
echo " - For the earliest unsigned commit $short_hash (skipping merge commits):"
7673
echo " git rebase --onto $parent_commit $parent_commit \\"
7774
echo " --exec 'if [ \$(git rev-list --parents -n 1 HEAD | awk \"{print NF-1}\") -eq 1 ]; then git commit --amend -sS --no-edit; else echo \"Skipping merge commit \$(git rev-parse --short HEAD)\"; fi'"
78-
7975
echo
8076
echo "Then push normally with:"
8177
echo " git push"
@@ -92,4 +88,4 @@ while read local_ref local_sha remote_ref remote_sha; do
9288
fi
9389
done
9490

95-
echo "${GREEN}All commits are signed and verified${RESET}"
91+
echo "${GREEN}No unsigned commits found${RESET}"
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsString } from 'class-validator';
3+
4+
export class ClientTokenDto {
5+
@ApiProperty()
6+
@IsString({ message: 'orgId must be in string format.' })
7+
orgId: string;
8+
9+
@ApiProperty()
10+
@IsString({ message: 'clientAlias must be in string format.' })
11+
clientAlias: string;
12+
13+
@ApiProperty()
14+
@IsString({ message: 'clientId must be in string format.' })
15+
clientId: string;
16+
17+
@ApiProperty()
18+
@IsString({ message: 'clientSecret must be in string format.' })
19+
clientSecret: string;
20+
21+
@ApiProperty()
22+
@IsString({ message: 'grantType must be in string format.' })
23+
grantType?: string = 'client_credentials';
24+
}

apps/api-gateway/src/organization/organization.controller.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import { UserAccessGuard } from '../authz/guards/user-access-guard';
5454
import { GetAllOrganizationsDto } from './dtos/get-organizations.dto';
5555
import { PrimaryDid } from './dtos/set-primary-did.dto';
5656
import { TrimStringParamPipe } from '@credebl/common/cast.helper';
57+
import { ClientTokenDto } from './dtos/client-token.dto';
5758

5859
@UseFilters(CustomExceptionFilter)
5960
@Controller('orgs')
@@ -789,4 +790,16 @@ export class OrganizationController {
789790
};
790791
return res.status(HttpStatus.OK).json(finalResponse);
791792
}
793+
794+
@Post('/generateIssuerApiToken')
795+
@ApiExcludeEndpoint()
796+
@ApiOperation({
797+
summary: 'Generate API Token for the issuer',
798+
description: 'Generate API Token for the issuer'
799+
})
800+
@ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto })
801+
async generateApiToken(@Body() clientTokenDto: ClientTokenDto, @Res() res: Response): Promise<Response> {
802+
const finalResponse = await this.organizationService.generateClientApiToken(clientTokenDto);
803+
return res.status(HttpStatus.OK).header('Content-Type', 'application/json').send(finalResponse);
804+
}
792805
}

apps/api-gateway/src/organization/organization.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { GetAllOrganizationsDto } from './dtos/get-organizations.dto';
2424
import { PrimaryDid } from './dtos/set-primary-did.dto';
2525
import { NATSClient } from '@credebl/common/NATSClient';
2626
import { ClientProxy } from '@nestjs/microservices';
27+
import { ClientTokenDto } from './dtos/client-token.dto';
2728

2829
@Injectable()
2930
export class OrganizationService extends BaseService {
@@ -238,4 +239,7 @@ export class OrganizationService extends BaseService {
238239
const imageBuffer = Buffer.from(base64Data, 'base64');
239240
return imageBuffer;
240241
}
242+
async generateClientApiToken(clientTokenDto: ClientTokenDto): Promise<{ token: string }> {
243+
return this.natsClient.sendNatsMessage(this.serviceProxy, 'generate-client-api-token', clientTokenDto);
244+
}
241245
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export class ClientTokenDto {
2+
orgId: string;
3+
clientAlias: string;
4+
clientId: string;
5+
clientSecret: string;
6+
grantType?: string = 'client_credentials';
7+
}

apps/organization/repositories/organization.repository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ export class OrganizationRepository {
662662
countryId: true,
663663
stateId: true,
664664
cityId: true,
665+
appLaunchDetails: true,
665666
userOrgRoles: {
666667
where: {
667668
orgRole: {

apps/organization/src/organization.controller.ts

Lines changed: 64 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,27 @@ import { OrganizationService } from './organization.service';
44
import { CreateOrganizationDto } from '../dtos/create-organization.dto';
55
import { BulkSendInvitationDto } from '../dtos/send-invitation.dto';
66
import { UpdateInvitationDto } from '../dtos/update-invitation.dt';
7-
import { IDidList, IGetOrgById, IGetOrganization, IOrgDetails, IUpdateOrganization, Payload } from '../interfaces/organization.interface';
8-
import { IOrgCredentials, IOrganizationInvitations, IOrganization, IOrganizationDashboard, IDeleteOrganization, IOrgActivityCount } from '@credebl/common/interfaces/organization.interface';
7+
import {
8+
IDidList,
9+
IGetOrgById,
10+
IGetOrganization,
11+
IOrgDetails,
12+
IUpdateOrganization,
13+
Payload
14+
} from '../interfaces/organization.interface';
15+
import {
16+
IOrgCredentials,
17+
IOrganizationInvitations,
18+
IOrganization,
19+
IOrganizationDashboard,
20+
IDeleteOrganization,
21+
IOrgActivityCount
22+
} from '@credebl/common/interfaces/organization.interface';
923
import { organisation, user } from '@prisma/client';
1024
import { IAccessTokenData } from '@credebl/common/interfaces/interface';
1125
import { IClientRoles } from '@credebl/client-registration/interfaces/client.interface';
1226
import { IOrgRoles } from 'libs/org-roles/interfaces/org-roles.interface';
27+
import { ClientTokenDto } from '../dtos/client-token.dto';
1328

1429
@Controller()
1530
export class OrganizationController {
@@ -23,7 +38,9 @@ export class OrganizationController {
2338
*/
2439

2540
@MessagePattern({ cmd: 'create-organization' })
26-
async createOrganization(@Body() payload: { createOrgDto: CreateOrganizationDto; userId: string, keycloakUserId: string }): Promise<organisation> {
41+
async createOrganization(
42+
@Body() payload: { createOrgDto: CreateOrganizationDto; userId: string; keycloakUserId: string }
43+
): Promise<organisation> {
2744
return this.organizationService.createOrganization(payload.createOrgDto, payload.userId, payload.keycloakUserId);
2845
}
2946

@@ -34,17 +51,19 @@ export class OrganizationController {
3451
*/
3552

3653
@MessagePattern({ cmd: 'set-primary-did' })
37-
async setPrimaryDid(@Body() payload: { orgId:string, did:string, id:string}): Promise<string> {
54+
async setPrimaryDid(@Body() payload: { orgId: string; did: string; id: string }): Promise<string> {
3855
return this.organizationService.setPrimaryDid(payload.orgId, payload.did, payload.id);
3956
}
4057

4158
/**
42-
*
43-
* @param payload
59+
*
60+
* @param payload
4461
* @returns organization client credentials
4562
*/
4663
@MessagePattern({ cmd: 'create-org-credentials' })
47-
async createOrgCredentials(@Body() payload: { orgId: string; userId: string, keycloakUserId: string }): Promise<IOrgCredentials> {
64+
async createOrgCredentials(
65+
@Body() payload: { orgId: string; userId: string; keycloakUserId: string }
66+
): Promise<IOrgCredentials> {
4867
return this.organizationService.createOrgCredentials(payload.orgId, payload.userId, payload.keycloakUserId);
4968
}
5069

@@ -55,7 +74,11 @@ export class OrganizationController {
5574
*/
5675

5776
@MessagePattern({ cmd: 'update-organization' })
58-
async updateOrganization(payload: { updateOrgDto: IUpdateOrganization; userId: string, orgId: string }): Promise<organisation> {
77+
async updateOrganization(payload: {
78+
updateOrgDto: IUpdateOrganization;
79+
userId: string;
80+
orgId: string;
81+
}): Promise<organisation> {
5982
return this.organizationService.updateOrganization(payload.updateOrgDto, payload.userId, payload.orgId);
6083
}
6184

@@ -65,7 +88,7 @@ export class OrganizationController {
6588
* @returns organization's did list
6689
*/
6790
@MessagePattern({ cmd: 'fetch-organization-dids' })
68-
async getOrgDidList(payload: {orgId:string}): Promise<IDidList[]> {
91+
async getOrgDidList(payload: { orgId: string }): Promise<IDidList[]> {
6992
return this.organizationService.getOrgDidList(payload.orgId);
7093
}
7194

@@ -75,9 +98,7 @@ export class OrganizationController {
7598
* @returns Get created organization details
7699
*/
77100
@MessagePattern({ cmd: 'get-organizations' })
78-
async getOrganizations(
79-
@Body() payload: { userId: string} & Payload
80-
): Promise<IGetOrganization> {
101+
async getOrganizations(@Body() payload: { userId: string } & Payload): Promise<IGetOrganization> {
81102
const { userId, pageNumber, pageSize, search, role } = payload;
82103
return this.organizationService.getOrganizations(userId, pageNumber, pageSize, search, role);
83104
}
@@ -87,22 +108,17 @@ export class OrganizationController {
87108
* @returns Get created organization details
88109
*/
89110
@MessagePattern({ cmd: 'get-organizations-count' })
90-
async countTotalOrgs(
91-
@Body() payload: { userId: string}
92-
): Promise<number> {
93-
111+
async countTotalOrgs(@Body() payload: { userId: string }): Promise<number> {
94112
const { userId } = payload;
95-
113+
96114
return this.organizationService.countTotalOrgs(userId);
97115
}
98116

99117
/**
100118
* @returns Get public organization details
101119
*/
102120
@MessagePattern({ cmd: 'get-public-organizations' })
103-
async getPublicOrganizations(
104-
@Body() payload: Payload
105-
): Promise<IGetOrganization> {
121+
async getPublicOrganizations(@Body() payload: Payload): Promise<IGetOrganization> {
106122
const { pageNumber, pageSize, search } = payload;
107123
return this.organizationService.getPublicOrganizations(pageNumber, pageSize, search);
108124
}
@@ -113,13 +129,13 @@ export class OrganizationController {
113129
* @returns Get created organization details
114130
*/
115131
@MessagePattern({ cmd: 'get-organization-by-id' })
116-
async getOrganization(@Body() payload: { orgId: string; userId: string}): Promise<IGetOrgById> {
132+
async getOrganization(@Body() payload: { orgId: string; userId: string }): Promise<IGetOrgById> {
117133
return this.organizationService.getOrganization(payload.orgId);
118134
}
119-
/**
120-
* @param orgSlug
121-
* @returns organization details
122-
*/
135+
/**
136+
* @param orgSlug
137+
* @returns organization details
138+
*/
123139
@MessagePattern({ cmd: 'get-organization-public-profile' })
124140
async getPublicProfile(payload: { orgSlug }): Promise<IGetOrgById> {
125141
return this.organizationService.getPublicProfile(payload);
@@ -131,9 +147,7 @@ export class OrganizationController {
131147
* @returns Get created invitation details
132148
*/
133149
@MessagePattern({ cmd: 'get-invitations-by-orgId' })
134-
async getInvitationsByOrgId(
135-
@Body() payload: { orgId: string } & Payload
136-
): Promise<IOrganizationInvitations> {
150+
async getInvitationsByOrgId(@Body() payload: { orgId: string } & Payload): Promise<IOrganizationInvitations> {
137151
return this.organizationService.getInvitationsByOrgId(
138152
payload.orgId,
139153
payload.pageNumber,
@@ -143,11 +157,11 @@ export class OrganizationController {
143157
}
144158

145159
/**
146-
* @returns Get org-roles
160+
* @returns Get org-roles
147161
*/
148162

149163
@MessagePattern({ cmd: 'get-org-roles' })
150-
async getOrgRoles(payload: {orgId: string, user: user}): Promise<IClientRoles[]> {
164+
async getOrgRoles(payload: { orgId: string; user: user }): Promise<IClientRoles[]> {
151165
return this.organizationService.getOrgRoles(payload.orgId, payload.user);
152166
}
153167

@@ -163,7 +177,7 @@ export class OrganizationController {
163177
*/
164178
@MessagePattern({ cmd: 'send-invitation' })
165179
async createInvitation(
166-
@Body() payload: { bulkInvitationDto: BulkSendInvitationDto; userId: string, userEmail: string }
180+
@Body() payload: { bulkInvitationDto: BulkSendInvitationDto; userId: string; userEmail: string }
167181
): Promise<string> {
168182
return this.organizationService.createInvitation(payload.bulkInvitationDto, payload.userId, payload.userEmail);
169183
}
@@ -198,7 +212,7 @@ export class OrganizationController {
198212
*/
199213

200214
@MessagePattern({ cmd: 'update-user-roles' })
201-
async updateUserRoles(payload: { orgId: string; roleIds: string[]; userId: string}): Promise<boolean> {
215+
async updateUserRoles(payload: { orgId: string; roleIds: string[]; userId: string }): Promise<boolean> {
202216
return this.organizationService.updateUserRoles(payload.orgId, payload.roleIds, payload.userId);
203217
}
204218

@@ -212,9 +226,9 @@ export class OrganizationController {
212226
return this.organizationService.getOrganizationActivityCount(payload.orgId, payload.userId);
213227
}
214228

215-
/**
216-
* @returns organization profile details
217-
*/
229+
/**
230+
* @returns organization profile details
231+
*/
218232
@MessagePattern({ cmd: 'fetch-organization-profile' })
219233
async getOrgPofile(payload: { orgId: string }): Promise<organisation> {
220234
return this.organizationService.getOrgPofile(payload.orgId);
@@ -231,27 +245,27 @@ export class OrganizationController {
231245
}
232246

233247
@MessagePattern({ cmd: 'get-organization-details' })
234-
async getOrgData(payload: { orgId: string; }): Promise<organisation> {
248+
async getOrgData(payload: { orgId: string }): Promise<organisation> {
235249
return this.organizationService.getOrgDetails(payload.orgId);
236250
}
237-
251+
238252
@MessagePattern({ cmd: 'delete-organization' })
239-
async deleteOrganization(payload: { orgId: string, user: user }): Promise<IDeleteOrganization> {
253+
async deleteOrganization(payload: { orgId: string; user: user }): Promise<IDeleteOrganization> {
240254
return this.organizationService.deleteOrganization(payload.orgId, payload.user);
241255
}
242256

243257
@MessagePattern({ cmd: 'delete-org-client-credentials' })
244-
async deleteOrganizationCredentials(payload: { orgId: string, user: user }): Promise<string> {
258+
async deleteOrganizationCredentials(payload: { orgId: string; user: user }): Promise<string> {
245259
return this.organizationService.deleteClientCredentials(payload.orgId, payload.user);
246260
}
247261

248262
@MessagePattern({ cmd: 'delete-organization-invitation' })
249-
async deleteOrganizationInvitation(payload: { orgId: string; invitationId: string; }): Promise<boolean> {
263+
async deleteOrganizationInvitation(payload: { orgId: string; invitationId: string }): Promise<boolean> {
250264
return this.organizationService.deleteOrganizationInvitation(payload.orgId, payload.invitationId);
251265
}
252266

253267
@MessagePattern({ cmd: 'authenticate-client-credentials' })
254-
async clientLoginCredentails(payload: { clientId: string; clientSecret: string;}): Promise<IAccessTokenData> {
268+
async clientLoginCredentails(payload: { clientId: string; clientSecret: string }): Promise<IAccessTokenData> {
255269
return this.organizationService.clientLoginCredentails(payload);
256270
}
257271

@@ -261,12 +275,12 @@ export class OrganizationController {
261275
}
262276

263277
@MessagePattern({ cmd: 'get-agent-type-by-org-agent-type-id' })
264-
async getAgentTypeByAgentTypeId(payload: {orgAgentTypeId: string}): Promise<string> {
278+
async getAgentTypeByAgentTypeId(payload: { orgAgentTypeId: string }): Promise<string> {
265279
return this.organizationService.getAgentTypeByAgentTypeId(payload.orgAgentTypeId);
266280
}
267281

268282
@MessagePattern({ cmd: 'get-org-roles-details' })
269-
async getOrgRolesDetails(payload: {roleName: string}): Promise<object> {
283+
async getOrgRolesDetails(payload: { roleName: string }): Promise<object> {
270284
return this.organizationService.getOrgRolesDetails(payload.roleName);
271285
}
272286

@@ -286,7 +300,12 @@ export class OrganizationController {
286300
}
287301

288302
@MessagePattern({ cmd: 'get-org-agents-and-user-roles' })
289-
async getOrgAgentDetailsForEcosystem(payload: {orgIds: string[], search: string}): Promise<IOrgDetails> {
303+
async getOrgAgentDetailsForEcosystem(payload: { orgIds: string[]; search: string }): Promise<IOrgDetails> {
290304
return this.organizationService.getOrgAgentDetailsForEcosystem(payload);
291305
}
292-
}
306+
307+
@MessagePattern({ cmd: 'generate-client-api-token' })
308+
async generateClientApiToken(payload: ClientTokenDto): Promise<{ token: string }> {
309+
return this.organizationService.generateClientApiToken(payload);
310+
}
311+
}

0 commit comments

Comments
 (0)