@pnp/cli-microsoft365
Version:
Manage Microsoft 365 and SharePoint Framework projects on any platform
120 lines • 5.53 kB
JavaScript
import { z } from 'zod';
import { globalOptionsZod } from '../../../../Command.js';
import request from '../../../../request.js';
import { odata } from '../../../../utils/odata.js';
import GraphCommand from '../../../base/GraphCommand.js';
import commands from '../../commands.js';
const behaviorDuringRetentionPeriods = ['doNotRetain', 'retain', 'retainAsRecord', 'retainAsRegulatoryRecord'];
const actionAfterRetentionPeriods = ['none', 'delete', 'startDispositionReview'];
const retentionTriggers = ['dateLabeled', 'dateCreated', 'dateModified', 'dateOfEvent'];
const defaultRecordBehaviors = ['startLocked', 'startUnlocked'];
export const options = z.strictObject({
...globalOptionsZod.shape,
displayName: z.string().alias('n'),
behaviorDuringRetentionPeriod: z.enum(behaviorDuringRetentionPeriods),
actionAfterRetentionPeriod: z.enum(actionAfterRetentionPeriods),
retentionDuration: z.string().refine(val => !isNaN(Number(val)), {
error: 'retentionDuration must be a number'
}),
retentionTrigger: z.enum(retentionTriggers).optional().alias('t'),
defaultRecordBehavior: z.enum(defaultRecordBehaviors).optional(),
descriptionForUsers: z.string().optional(),
descriptionForAdmins: z.string().optional(),
labelToBeApplied: z.string().optional(),
eventTypeId: z.string().optional(),
eventTypeName: z.string().optional()
});
class PurviewRetentionLabelAddCommand extends GraphCommand {
get name() {
return commands.RETENTIONLABEL_ADD;
}
get description() {
return 'Creates a retention label';
}
get schema() {
return options;
}
getRefinedSchema(schema) {
return schema
.refine(opts => {
if (opts.retentionTrigger === 'dateOfEvent') {
return [opts.eventTypeId, opts.eventTypeName].filter(x => x !== undefined).length === 1;
}
return true;
}, {
error: `Specify either 'eventTypeId' or 'eventTypeName', but not both.`,
params: {
customCode: 'optionSet',
options: ['eventTypeId', 'eventTypeName']
}
});
}
async commandAction(logger, args) {
const retentionTrigger = args.options.retentionTrigger ? args.options.retentionTrigger : 'dateLabeled';
const defaultRecordBehavior = args.options.defaultRecordBehavior ? args.options.defaultRecordBehavior : 'startLocked';
const requestBody = {
displayName: args.options.displayName,
behaviorDuringRetentionPeriod: args.options.behaviorDuringRetentionPeriod,
actionAfterRetentionPeriod: args.options.actionAfterRetentionPeriod,
retentionTrigger: retentionTrigger,
retentionDuration: {
'@odata.type': '#microsoft.graph.security.retentionDurationInDays',
days: Number(args.options.retentionDuration)
},
defaultRecordBehavior: defaultRecordBehavior
};
if (args.options.retentionTrigger === 'dateOfEvent') {
const eventTypeId = await this.getEventTypeId(args, logger);
requestBody['retentionEventType@odata.bind'] = `https://graph.microsoft.com/beta/security/triggerTypes/retentionEventTypes/${eventTypeId}`;
}
if (args.options.descriptionForAdmins) {
if (this.verbose) {
await logger.logToStderr(`Using '${args.options.descriptionForAdmins}' as descriptionForAdmins`);
}
requestBody.descriptionForAdmins = args.options.descriptionForAdmins;
}
if (args.options.descriptionForUsers) {
if (this.verbose) {
await logger.logToStderr(`Using '${args.options.descriptionForUsers}' as descriptionForUsers`);
}
requestBody.descriptionForUsers = args.options.descriptionForUsers;
}
if (args.options.labelToBeApplied) {
if (this.verbose) {
await logger.logToStderr(`Using '${args.options.labelToBeApplied}' as labelToBeApplied...`);
}
requestBody.labelToBeApplied = args.options.labelToBeApplied;
}
const requestOptions = {
url: `${this.resource}/beta/security/labels/retentionLabels`,
headers: {
accept: 'application/json;odata.metadata=none'
},
data: requestBody,
responseType: 'json'
};
try {
const response = await request.post(requestOptions);
await logger.log(response);
}
catch (err) {
this.handleRejectedODataPromise(err);
}
}
async getEventTypeId(args, logger) {
if (args.options.eventTypeId) {
return args.options.eventTypeId;
}
if (this.verbose) {
await logger.logToStderr(`Retrieving the event type id for event type ${args.options.eventTypeName}`);
}
const eventTypes = await odata.getAllItems(`${this.resource}/beta/security/triggerTypes/retentionEventTypes`);
const filteredEventTypes = eventTypes.filter((eventType) => eventType.displayName === args.options.eventTypeName);
if (filteredEventTypes.length === 0) {
throw `The specified retention event type '${args.options.eventTypeName}' does not exist.`;
}
return filteredEventTypes[0].id;
}
}
export default new PurviewRetentionLabelAddCommand();
//# sourceMappingURL=retentionlabel-add.js.map