@futura-dev/microsoft-sdk 0.0.1

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.
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@futura-dev/microsoft-sdk",
3
+ "private": false,
4
+ "description": "",
5
+ "version": "0.0.1",
6
+ "main": "index.js",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1",
9
+ "build": "rimraf dist && tsc",
10
+ "prepublish": "npm run build",
11
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
12
+ },
13
+ "keywords": [],
14
+ "author": "",
15
+ "license": "ISC",
16
+ "dependencies": {
17
+ "@azure/msal-node": "^1.17.2",
18
+ "@nestjs/axios": "^2.0.0",
19
+ "@nestjs/common": "^9.4.0",
20
+ "axios": "^1.4.0",
21
+ "typescript": "^5.0.4"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^18.16.3",
25
+ "rimraf": "^5.0.0"
26
+ }
27
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { MicrosoftApiModule } from "./microsoft-api/microsoft-api.module";
2
+ import { MicrosoftApiService } from "./microsoft-api/microsoft-api.service";
3
+
4
+ export { MicrosoftApiModule, MicrosoftApiService }
@@ -0,0 +1,14 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { HttpModule } from '@nestjs/axios';
3
+ import { MicrosoftApiService } from './microsoft-api.service';
4
+
5
+ @Module({
6
+ imports: [
7
+ HttpModule.register({
8
+ headers: {},
9
+ }),
10
+ ],
11
+ providers: [MicrosoftApiService],
12
+ exports: [MicrosoftApiService],
13
+ })
14
+ export class MicrosoftApiModule {}
@@ -0,0 +1,299 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { HttpService } from '@nestjs/axios';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import * as msal from '@azure/msal-node';
5
+ import * as process from 'process';
6
+ import { HRListItem, ListLog } from './types';
7
+
8
+ @Injectable()
9
+ export class MicrosoftApiService {
10
+ constructor(private readonly http: HttpService) {}
11
+
12
+ simpleLogin = (options: {
13
+ clientId: string;
14
+ scope: string;
15
+ clientSecret: string;
16
+ grantType: string;
17
+ tenantId: string;
18
+ }) => {
19
+ const body = new FormData();
20
+ body.set('client_id', options.clientId);
21
+ body.set('scope', options.scope);
22
+ body.set('client_secret', options.clientSecret);
23
+ body.set('grant_type', options.grantType);
24
+
25
+ return firstValueFrom(
26
+ this.http.post<any>(
27
+ `https://login.microsoft.com/${options.tenantId}/oauth2/v2.0/token`,
28
+ body,
29
+ {
30
+ headers: { 'Content-Type': 'multipart/form-data' },
31
+ },
32
+ ),
33
+ );
34
+ };
35
+
36
+ loginWithCertificate = (options: {
37
+ tenantId: string;
38
+ clientId: string;
39
+ thumbprint: string;
40
+ privateKey: string;
41
+ scopes: string[];
42
+ }) => {
43
+ const B = new msal.ConfidentialClientApplication({
44
+ auth: {
45
+ knownAuthorities: [
46
+ `https://login.microsoftonline.com/${options.tenantId}`,
47
+ ],
48
+ clientId: `${options.clientId}`,
49
+ clientCertificate: {
50
+ thumbprint: options.thumbprint,
51
+ privateKey: options.privateKey,
52
+ },
53
+ },
54
+ });
55
+ return B.acquireTokenByClientCredential({
56
+ authority: `https://login.microsoftonline.com/${options.tenantId}`,
57
+ scopes: options.scopes,
58
+ });
59
+ };
60
+
61
+ subscribe = async (
62
+ listId: string,
63
+ notificationUrl: string,
64
+ expirationTimestamp: number,
65
+ ) => {
66
+ console.log('[SUBSCRIPTION REQUEST]:', listId, notificationUrl);
67
+ // read key from files
68
+ // login
69
+ const auth = await this.loginWithCertificate({
70
+ clientId: process.env.AZURE_AD_CLIENT_ID,
71
+ scopes: [`${process.env.AZURE_AD_SCOPE}`],
72
+ tenantId: process.env.AZURE_AD_TENANT_ID,
73
+ thumbprint: process.env.CERTIFICATE_THUMBPRINT,
74
+ privateKey:
75
+ '-----BEGIN RSA PRIVATE KEY-----\n' +
76
+ 'MIIEpAIBAAKCAQEAwRdWyopVfuYKxbg4+4JQKAnHcA/lGsotrZAjhQJoix+aFlw/\n' +
77
+ '3vKQC/33fKEApK2odsmVAJUP1k1p31Fb8eddNlsM4cPacsWSHZ2x+Qcds1gouSdO\n' +
78
+ 'CROkQmro0jybH+3puFEV2Gr3E5LIo62p9LFL9nvCvM1fHrsXTOV2mJAVdLTgqkoC\n' +
79
+ 'oVTUZji+tcde64jsFx6zvgedKWRkUOXZOJC5gkfkcrkbjWwEq/lSYtbm4sRif9Eu\n' +
80
+ 'FdqjYM3XqiF+TwEu1HIm37UyEE4jKn22PyG7JhiIffKvVHo7dIZPFcI9j8wBfeBA\n' +
81
+ 'PZjZ0qh+i9/b8odQ6u0S/siYP82rHovKg5kzJwIDAQABAoIBAC/wanTouWdDF+OU\n' +
82
+ '5FjVNq9qFiDlYV0wWvzfb2Ijge8gjnIEvzrMACVqDVrc4jsAfnXXgG3flEoBeEqg\n' +
83
+ 'eXJqncLUAjO/G2opUSiXMUuBj8cqGRo2/vHT9ZEj19/yehUITWGciA7uJ5+tbrDs\n' +
84
+ 'eeitaA2vFl8nofkQPC20PqiMBTevDd6h6wsuZFKQWKI5P0fu67UvD8kLXyUApx+h\n' +
85
+ 'Z+vV41cgWuOBit5q1k6CZs4eZZw0mr81Wu7i6ueUwQTZbHE1AF5luh1lxrT+v05B\n' +
86
+ 'Nu0XNMCuEjjsgKe91xVdyqwTg9EpQ8kO+4NTn/ZMDXLOix36S12w/22WkC5f8hy3\n' +
87
+ 'B05JjnkCgYEA8WGCMFvj+y0r71b+H7KhdlnOKA4zEAlo2yJAGylky0lHtzEztnrL\n' +
88
+ 'SplLK2Q3AF8i7XWiXQ9ubmGSLDB1NsKHfCHjtVu7jh3G+LOQoFBEKHY5gDzAZkZQ\n' +
89
+ 'iGhxWO1FrX2xIykZXSNqlx9JOKpSkDdiSS97Map+BYJqio18h5Q2cysCgYEAzMkf\n' +
90
+ 'RflUuY1O50a3OWHe/DZTIF3rTIhwx6/fylflGHOAsBkYSvCl6FL0znxE7vwtcGK2\n' +
91
+ 'uGoAn+H1WOl77QIXlyxdIGQ+DE+137r3IvSjPE/SJeWNk+1h1t6A/LyhYYEuqX4w\n' +
92
+ '8A/TbSqp1o2NA4mX5Sp4dHW5o8OxwXJ4sQB1cfUCgYEAkaJoPy8h9SkC6gvNlWhc\n' +
93
+ 'XKDAbpBqpJFYz2Xx0bF+29whxdiMv9uEjkTBArQbL0E3PJgN1yH5WeXKoJi4D8r8\n' +
94
+ 'nZuA3Ko1FgDHTMRiTSdAiD0UYlfFKa/g5PxG7wVxVcSRPIqOgBBfPkClF+hDmjmg\n' +
95
+ 'NlHMfWHFWSOfjmrhKJf25jMCgYEAiDqfCECWAR2kyKu9RXn7CZLl95ki53W4eM5h\n' +
96
+ 'tEyGRZ7Ik90N0QSHiaZt3lLC1KyDWckBPmqd4b5CJZSk8QS8Rr+nb93ffPclySCq\n' +
97
+ 'OOG/GWcMKFOtvCNlO7gm3HprbN6v+ObOjVQp1OxVsTnW/exxVGzNVsPd67hKLqME\n' +
98
+ '8NKaTmUCgYAdBEPSHuPesPXXYgsE9aaBjUwBEP5an9ZsdH4CAOgaJ+qi6lNpHow2\n' +
99
+ 'O+9rSx/VldqwlnFj++6gPEdyVGw4NRnrO2kZvRoY7zrizmVZok1Kcv2fdThzWjWB\n' +
100
+ '4fdduO1lx6pBaBa4LZbOIRCNsHXYLdOInjnOJC9RJ86lsGTWr1lH6A==\n' +
101
+ '-----END RSA PRIVATE KEY-----',
102
+ });
103
+ return firstValueFrom(
104
+ this.http.post(
105
+ `https://futuraitsrl.sharepoint.com/sites/hr/_api/web/lists('${listId}')/subscriptions`,
106
+ {
107
+ resource:
108
+ 'https://futuraitsrl.sharepoint.com/sites/hr/Lists/Recruiting%20Board/AllItems.aspx',
109
+ notificationUrl: `${notificationUrl}`,
110
+ expirationDateTime: new Date(expirationTimestamp).toISOString(),
111
+ },
112
+ {
113
+ headers: {
114
+ Authorization: `Bearer ${auth.accessToken}`,
115
+ },
116
+ },
117
+ ),
118
+ );
119
+ };
120
+
121
+ deleteSubscription = async (listId: string, subscriptionId: string) => {
122
+ const auth = await this.loginWithCertificate({
123
+ clientId: process.env.AZURE_AD_CLIENT_ID,
124
+ scopes: [`${process.env.AZURE_AD_SCOPE}`],
125
+ tenantId: process.env.AZURE_AD_TENANT_ID,
126
+ thumbprint: process.env.CERTIFICATE_THUMBPRINT,
127
+ privateKey:
128
+ '-----BEGIN RSA PRIVATE KEY-----\n' +
129
+ 'MIIEpAIBAAKCAQEAwRdWyopVfuYKxbg4+4JQKAnHcA/lGsotrZAjhQJoix+aFlw/\n' +
130
+ '3vKQC/33fKEApK2odsmVAJUP1k1p31Fb8eddNlsM4cPacsWSHZ2x+Qcds1gouSdO\n' +
131
+ 'CROkQmro0jybH+3puFEV2Gr3E5LIo62p9LFL9nvCvM1fHrsXTOV2mJAVdLTgqkoC\n' +
132
+ 'oVTUZji+tcde64jsFx6zvgedKWRkUOXZOJC5gkfkcrkbjWwEq/lSYtbm4sRif9Eu\n' +
133
+ 'FdqjYM3XqiF+TwEu1HIm37UyEE4jKn22PyG7JhiIffKvVHo7dIZPFcI9j8wBfeBA\n' +
134
+ 'PZjZ0qh+i9/b8odQ6u0S/siYP82rHovKg5kzJwIDAQABAoIBAC/wanTouWdDF+OU\n' +
135
+ '5FjVNq9qFiDlYV0wWvzfb2Ijge8gjnIEvzrMACVqDVrc4jsAfnXXgG3flEoBeEqg\n' +
136
+ 'eXJqncLUAjO/G2opUSiXMUuBj8cqGRo2/vHT9ZEj19/yehUITWGciA7uJ5+tbrDs\n' +
137
+ 'eeitaA2vFl8nofkQPC20PqiMBTevDd6h6wsuZFKQWKI5P0fu67UvD8kLXyUApx+h\n' +
138
+ 'Z+vV41cgWuOBit5q1k6CZs4eZZw0mr81Wu7i6ueUwQTZbHE1AF5luh1lxrT+v05B\n' +
139
+ 'Nu0XNMCuEjjsgKe91xVdyqwTg9EpQ8kO+4NTn/ZMDXLOix36S12w/22WkC5f8hy3\n' +
140
+ 'B05JjnkCgYEA8WGCMFvj+y0r71b+H7KhdlnOKA4zEAlo2yJAGylky0lHtzEztnrL\n' +
141
+ 'SplLK2Q3AF8i7XWiXQ9ubmGSLDB1NsKHfCHjtVu7jh3G+LOQoFBEKHY5gDzAZkZQ\n' +
142
+ 'iGhxWO1FrX2xIykZXSNqlx9JOKpSkDdiSS97Map+BYJqio18h5Q2cysCgYEAzMkf\n' +
143
+ 'RflUuY1O50a3OWHe/DZTIF3rTIhwx6/fylflGHOAsBkYSvCl6FL0znxE7vwtcGK2\n' +
144
+ 'uGoAn+H1WOl77QIXlyxdIGQ+DE+137r3IvSjPE/SJeWNk+1h1t6A/LyhYYEuqX4w\n' +
145
+ '8A/TbSqp1o2NA4mX5Sp4dHW5o8OxwXJ4sQB1cfUCgYEAkaJoPy8h9SkC6gvNlWhc\n' +
146
+ 'XKDAbpBqpJFYz2Xx0bF+29whxdiMv9uEjkTBArQbL0E3PJgN1yH5WeXKoJi4D8r8\n' +
147
+ 'nZuA3Ko1FgDHTMRiTSdAiD0UYlfFKa/g5PxG7wVxVcSRPIqOgBBfPkClF+hDmjmg\n' +
148
+ 'NlHMfWHFWSOfjmrhKJf25jMCgYEAiDqfCECWAR2kyKu9RXn7CZLl95ki53W4eM5h\n' +
149
+ 'tEyGRZ7Ik90N0QSHiaZt3lLC1KyDWckBPmqd4b5CJZSk8QS8Rr+nb93ffPclySCq\n' +
150
+ 'OOG/GWcMKFOtvCNlO7gm3HprbN6v+ObOjVQp1OxVsTnW/exxVGzNVsPd67hKLqME\n' +
151
+ '8NKaTmUCgYAdBEPSHuPesPXXYgsE9aaBjUwBEP5an9ZsdH4CAOgaJ+qi6lNpHow2\n' +
152
+ 'O+9rSx/VldqwlnFj++6gPEdyVGw4NRnrO2kZvRoY7zrizmVZok1Kcv2fdThzWjWB\n' +
153
+ '4fdduO1lx6pBaBa4LZbOIRCNsHXYLdOInjnOJC9RJ86lsGTWr1lH6A==\n' +
154
+ '-----END RSA PRIVATE KEY-----',
155
+ });
156
+ return firstValueFrom(
157
+ this.http.delete(
158
+ `https://futuraitsrl.sharepoint.com/sites/hr/_api/web/lists('${listId}')/subscriptions('${subscriptionId}')`,
159
+ {
160
+ headers: {
161
+ Authorization: `Bearer ${auth.accessToken}`,
162
+ },
163
+ },
164
+ ),
165
+ );
166
+ };
167
+
168
+ getSubscriptions = async (listId: string) => {
169
+ const auth = await this.loginWithCertificate({
170
+ clientId: process.env.AZURE_AD_CLIENT_ID,
171
+ scopes: [`${process.env.AZURE_AD_SCOPE}`],
172
+ tenantId: process.env.AZURE_AD_TENANT_ID,
173
+ thumbprint: process.env.CERTIFICATE_THUMBPRINT,
174
+ privateKey:
175
+ '-----BEGIN RSA PRIVATE KEY-----\n' +
176
+ 'MIIEpAIBAAKCAQEAwRdWyopVfuYKxbg4+4JQKAnHcA/lGsotrZAjhQJoix+aFlw/\n' +
177
+ '3vKQC/33fKEApK2odsmVAJUP1k1p31Fb8eddNlsM4cPacsWSHZ2x+Qcds1gouSdO\n' +
178
+ 'CROkQmro0jybH+3puFEV2Gr3E5LIo62p9LFL9nvCvM1fHrsXTOV2mJAVdLTgqkoC\n' +
179
+ 'oVTUZji+tcde64jsFx6zvgedKWRkUOXZOJC5gkfkcrkbjWwEq/lSYtbm4sRif9Eu\n' +
180
+ 'FdqjYM3XqiF+TwEu1HIm37UyEE4jKn22PyG7JhiIffKvVHo7dIZPFcI9j8wBfeBA\n' +
181
+ 'PZjZ0qh+i9/b8odQ6u0S/siYP82rHovKg5kzJwIDAQABAoIBAC/wanTouWdDF+OU\n' +
182
+ '5FjVNq9qFiDlYV0wWvzfb2Ijge8gjnIEvzrMACVqDVrc4jsAfnXXgG3flEoBeEqg\n' +
183
+ 'eXJqncLUAjO/G2opUSiXMUuBj8cqGRo2/vHT9ZEj19/yehUITWGciA7uJ5+tbrDs\n' +
184
+ 'eeitaA2vFl8nofkQPC20PqiMBTevDd6h6wsuZFKQWKI5P0fu67UvD8kLXyUApx+h\n' +
185
+ 'Z+vV41cgWuOBit5q1k6CZs4eZZw0mr81Wu7i6ueUwQTZbHE1AF5luh1lxrT+v05B\n' +
186
+ 'Nu0XNMCuEjjsgKe91xVdyqwTg9EpQ8kO+4NTn/ZMDXLOix36S12w/22WkC5f8hy3\n' +
187
+ 'B05JjnkCgYEA8WGCMFvj+y0r71b+H7KhdlnOKA4zEAlo2yJAGylky0lHtzEztnrL\n' +
188
+ 'SplLK2Q3AF8i7XWiXQ9ubmGSLDB1NsKHfCHjtVu7jh3G+LOQoFBEKHY5gDzAZkZQ\n' +
189
+ 'iGhxWO1FrX2xIykZXSNqlx9JOKpSkDdiSS97Map+BYJqio18h5Q2cysCgYEAzMkf\n' +
190
+ 'RflUuY1O50a3OWHe/DZTIF3rTIhwx6/fylflGHOAsBkYSvCl6FL0znxE7vwtcGK2\n' +
191
+ 'uGoAn+H1WOl77QIXlyxdIGQ+DE+137r3IvSjPE/SJeWNk+1h1t6A/LyhYYEuqX4w\n' +
192
+ '8A/TbSqp1o2NA4mX5Sp4dHW5o8OxwXJ4sQB1cfUCgYEAkaJoPy8h9SkC6gvNlWhc\n' +
193
+ 'XKDAbpBqpJFYz2Xx0bF+29whxdiMv9uEjkTBArQbL0E3PJgN1yH5WeXKoJi4D8r8\n' +
194
+ 'nZuA3Ko1FgDHTMRiTSdAiD0UYlfFKa/g5PxG7wVxVcSRPIqOgBBfPkClF+hDmjmg\n' +
195
+ 'NlHMfWHFWSOfjmrhKJf25jMCgYEAiDqfCECWAR2kyKu9RXn7CZLl95ki53W4eM5h\n' +
196
+ 'tEyGRZ7Ik90N0QSHiaZt3lLC1KyDWckBPmqd4b5CJZSk8QS8Rr+nb93ffPclySCq\n' +
197
+ 'OOG/GWcMKFOtvCNlO7gm3HprbN6v+ObOjVQp1OxVsTnW/exxVGzNVsPd67hKLqME\n' +
198
+ '8NKaTmUCgYAdBEPSHuPesPXXYgsE9aaBjUwBEP5an9ZsdH4CAOgaJ+qi6lNpHow2\n' +
199
+ 'O+9rSx/VldqwlnFj++6gPEdyVGw4NRnrO2kZvRoY7zrizmVZok1Kcv2fdThzWjWB\n' +
200
+ '4fdduO1lx6pBaBa4LZbOIRCNsHXYLdOInjnOJC9RJ86lsGTWr1lH6A==\n' +
201
+ '-----END RSA PRIVATE KEY-----',
202
+ });
203
+ return firstValueFrom(
204
+ this.http.get(
205
+ `https://futuraitsrl.sharepoint.com/sites/hr/_api/web/lists('${listId}')/subscriptions`,
206
+ {
207
+ headers: {
208
+ Authorization: `Bearer ${auth.accessToken}`,
209
+ },
210
+ },
211
+ ),
212
+ );
213
+ };
214
+
215
+ getListItem = async (options: {
216
+ siteId: string;
217
+ listId: string;
218
+ itemId: string;
219
+ }) => {
220
+ const auth = await this.simpleLogin({
221
+ clientId: process.env.AZURE_AD_SIMPLE_CLIENT_ID,
222
+ clientSecret: process.env.AZURE_AD_SIMPLE_CLIENT_SECRET,
223
+ grantType: process.env.AZURE_AD_GRANT_TYPE,
224
+ tenantId: process.env.AZURE_AD_TENANT_ID,
225
+ scope: process.env.AZURE_AD_SIMPLE_SCOPE,
226
+ });
227
+ return firstValueFrom(
228
+ this.http.get<HRListItem>(
229
+ `https://graph.microsoft.com/beta/sites/${options.siteId}/lists/${options.listId}/items/${options.itemId}?expand=fields`,
230
+ {
231
+ headers: {
232
+ Authorization: `Bearer ${auth.data.access_token}`,
233
+ },
234
+ },
235
+ ),
236
+ );
237
+ };
238
+
239
+ getListLogs = async (options: { listId: string; from: Date }) => {
240
+ const auth = await this.loginWithCertificate({
241
+ clientId: process.env.AZURE_AD_CLIENT_ID,
242
+ scopes: [`${process.env.AZURE_AD_SCOPE}`],
243
+ tenantId: process.env.AZURE_AD_TENANT_ID,
244
+ thumbprint: process.env.CERTIFICATE_THUMBPRINT,
245
+ privateKey:
246
+ '-----BEGIN RSA PRIVATE KEY-----\n' +
247
+ 'MIIEpAIBAAKCAQEAwRdWyopVfuYKxbg4+4JQKAnHcA/lGsotrZAjhQJoix+aFlw/\n' +
248
+ '3vKQC/33fKEApK2odsmVAJUP1k1p31Fb8eddNlsM4cPacsWSHZ2x+Qcds1gouSdO\n' +
249
+ 'CROkQmro0jybH+3puFEV2Gr3E5LIo62p9LFL9nvCvM1fHrsXTOV2mJAVdLTgqkoC\n' +
250
+ 'oVTUZji+tcde64jsFx6zvgedKWRkUOXZOJC5gkfkcrkbjWwEq/lSYtbm4sRif9Eu\n' +
251
+ 'FdqjYM3XqiF+TwEu1HIm37UyEE4jKn22PyG7JhiIffKvVHo7dIZPFcI9j8wBfeBA\n' +
252
+ 'PZjZ0qh+i9/b8odQ6u0S/siYP82rHovKg5kzJwIDAQABAoIBAC/wanTouWdDF+OU\n' +
253
+ '5FjVNq9qFiDlYV0wWvzfb2Ijge8gjnIEvzrMACVqDVrc4jsAfnXXgG3flEoBeEqg\n' +
254
+ 'eXJqncLUAjO/G2opUSiXMUuBj8cqGRo2/vHT9ZEj19/yehUITWGciA7uJ5+tbrDs\n' +
255
+ 'eeitaA2vFl8nofkQPC20PqiMBTevDd6h6wsuZFKQWKI5P0fu67UvD8kLXyUApx+h\n' +
256
+ 'Z+vV41cgWuOBit5q1k6CZs4eZZw0mr81Wu7i6ueUwQTZbHE1AF5luh1lxrT+v05B\n' +
257
+ 'Nu0XNMCuEjjsgKe91xVdyqwTg9EpQ8kO+4NTn/ZMDXLOix36S12w/22WkC5f8hy3\n' +
258
+ 'B05JjnkCgYEA8WGCMFvj+y0r71b+H7KhdlnOKA4zEAlo2yJAGylky0lHtzEztnrL\n' +
259
+ 'SplLK2Q3AF8i7XWiXQ9ubmGSLDB1NsKHfCHjtVu7jh3G+LOQoFBEKHY5gDzAZkZQ\n' +
260
+ 'iGhxWO1FrX2xIykZXSNqlx9JOKpSkDdiSS97Map+BYJqio18h5Q2cysCgYEAzMkf\n' +
261
+ 'RflUuY1O50a3OWHe/DZTIF3rTIhwx6/fylflGHOAsBkYSvCl6FL0znxE7vwtcGK2\n' +
262
+ 'uGoAn+H1WOl77QIXlyxdIGQ+DE+137r3IvSjPE/SJeWNk+1h1t6A/LyhYYEuqX4w\n' +
263
+ '8A/TbSqp1o2NA4mX5Sp4dHW5o8OxwXJ4sQB1cfUCgYEAkaJoPy8h9SkC6gvNlWhc\n' +
264
+ 'XKDAbpBqpJFYz2Xx0bF+29whxdiMv9uEjkTBArQbL0E3PJgN1yH5WeXKoJi4D8r8\n' +
265
+ 'nZuA3Ko1FgDHTMRiTSdAiD0UYlfFKa/g5PxG7wVxVcSRPIqOgBBfPkClF+hDmjmg\n' +
266
+ 'NlHMfWHFWSOfjmrhKJf25jMCgYEAiDqfCECWAR2kyKu9RXn7CZLl95ki53W4eM5h\n' +
267
+ 'tEyGRZ7Ik90N0QSHiaZt3lLC1KyDWckBPmqd4b5CJZSk8QS8Rr+nb93ffPclySCq\n' +
268
+ 'OOG/GWcMKFOtvCNlO7gm3HprbN6v+ObOjVQp1OxVsTnW/exxVGzNVsPd67hKLqME\n' +
269
+ '8NKaTmUCgYAdBEPSHuPesPXXYgsE9aaBjUwBEP5an9ZsdH4CAOgaJ+qi6lNpHow2\n' +
270
+ 'O+9rSx/VldqwlnFj++6gPEdyVGw4NRnrO2kZvRoY7zrizmVZok1Kcv2fdThzWjWB\n' +
271
+ '4fdduO1lx6pBaBa4LZbOIRCNsHXYLdOInjnOJC9RJ86lsGTWr1lH6A==\n' +
272
+ '-----END RSA PRIVATE KEY-----',
273
+ });
274
+ const startTick = options.from.getTime() * 10000 + 621355968000000000;
275
+ const start = `1;3;${options.listId};${startTick};-1`;
276
+ return firstValueFrom(
277
+ this.http.post<{ value: ListLog[] }>(
278
+ `https://futuraitsrl.sharepoint.com/sites/hr/_api/web/Lists(guid'${options.listId}')/getChanges`,
279
+ {
280
+ query: {
281
+ Add: true,
282
+ Alert: true,
283
+ DeleteObject: true,
284
+ Update: true,
285
+ Item: true,
286
+ ChangeTokenStart: {
287
+ StringValue: start,
288
+ },
289
+ },
290
+ },
291
+ {
292
+ headers: {
293
+ Authorization: `Bearer ${auth.accessToken}`,
294
+ },
295
+ },
296
+ ),
297
+ );
298
+ };
299
+ }
@@ -0,0 +1,104 @@
1
+ type MicrosoftGraphIdentitySet = {
2
+ id: string;
3
+ email: string;
4
+ displayName: string;
5
+ };
6
+
7
+ export type ListWebhook = {
8
+ value: {
9
+ subscriptionId: string;
10
+ clientState: null;
11
+ expirationDateTime: string;
12
+ resource: string;
13
+ tenantId: string;
14
+ siteUrl: string;
15
+ webId: string;
16
+ }[];
17
+ };
18
+
19
+ export type ListLog = {
20
+ 'odata.type': string;
21
+ 'odata.id': string;
22
+ 'odata.editLink': string;
23
+ ChangeToken: {
24
+ StringValue: `${number};${number};${string};${string};${string}`;
25
+ };
26
+ ChangeType: number;
27
+ SiteId: string;
28
+ Time: string;
29
+ Editor: string;
30
+ EditorEmailHint: null | any;
31
+ ItemId: number;
32
+ ListId: string;
33
+ ServerRelativeUrl: string;
34
+ SharedByUser: null | any;
35
+ SharedWithUsers: null | any;
36
+ UniqueId: string;
37
+ WebId: string;
38
+ };
39
+
40
+ export type ListItem<T> = {
41
+ '@odata.context': string;
42
+ '@odata.etag': string;
43
+ createdDateTime: string;
44
+ eTag: string;
45
+ id: string;
46
+ name: string;
47
+ lastModifiedDateTime: string;
48
+ description: string;
49
+ webUrl: string;
50
+ createdBy: {
51
+ user: MicrosoftGraphIdentitySet;
52
+ };
53
+ lastModifiedBy: {
54
+ user: MicrosoftGraphIdentitySet;
55
+ };
56
+ parentReference: {
57
+ id: string;
58
+ siteId: string;
59
+ };
60
+ contentType: {
61
+ id: string;
62
+ name: string;
63
+ };
64
+ 'fields@odata.context': string;
65
+ fields: T;
66
+ };
67
+ export type HRListItem = ListItem<{
68
+ '@odata.etag': string;
69
+ Title: string;
70
+ Attachments: boolean;
71
+ LinkTitle: string;
72
+ Position: string;
73
+ Progress: string;
74
+ RecruiterLookupId: string;
75
+ Email: string;
76
+ Telefono: string;
77
+ ApplicationDate: string;
78
+ PhoneScreenDate: string;
79
+ PhoneScreenerLookupId: string;
80
+ InterviewDate: string;
81
+ Interviewers: {
82
+ LookupId: number;
83
+ LookupValue: string;
84
+ Email: string;
85
+ };
86
+ Notes: string;
87
+ Profilo_x0020_LinkedIn: string;
88
+ Curriculum_x0020_URL: string;
89
+ id: string;
90
+ ContentType: string;
91
+ Modified: string;
92
+ Created: string;
93
+ AuthorLookupId: string;
94
+ EditorLookupId: string;
95
+ _UIVersionString: string;
96
+ Edit: string;
97
+ LinkTitleNoMenu: string;
98
+ ItemChildCount: string;
99
+ FolderChildCount: string;
100
+ _ComplianceFlags: string;
101
+ _ComplianceTag: string;
102
+ _ComplianceTagWrittenTime: string;
103
+ _ComplianceTagUserId: string;
104
+ }>;
package/tsconfig.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2017",
4
+ "module": "commonjs",
5
+ "lib": [
6
+ "es2017",
7
+ "es7",
8
+ "es6",
9
+ "dom"
10
+ ],
11
+ "declaration": true,
12
+ "declarationMap": true,
13
+ "sourceMap": true,
14
+ "outDir": "./dist",
15
+ "rootDir": "./src",
16
+ "strict": true,
17
+ "noImplicitAny": false,
18
+ "strictNullChecks": false,
19
+ "allowSyntheticDefaultImports": true,
20
+ "esModuleInterop": true,
21
+ "experimentalDecorators": true,
22
+ "emitDecoratorMetadata": true
23
+ },
24
+ "exclude": [
25
+ "node_modules",
26
+ "dist"
27
+ ]
28
+ }