Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V4 - Compliance #2886

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions docs/graph/compliance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
# @pnp/graph/compliance

The ability to interact with Microsoft Graph compliance and privacy APIs.

More information can be found in the official Graph documentation:

- [Compliance Resource Type](https://learn.microsoft.com/en-us/graph/api/resources/complianceapioverview?view=graph-rest-1.0)

## ICompliance, ISubjectRightsRequests, ISubjectRightsRequest, INotes

[![Invokable Banner](https://img.shields.io/badge/Invokable-informational.svg)](../concepts/invokable.md) [![Selective Imports Banner](https://img.shields.io/badge/Selective%20Imports-informational.svg)](../concepts/selective-imports.md)

## Subject rights request

### Get all Subject rights requests

Gets a list of Subject rights requests from Purview

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const requests = await graph.compliance.subjectRightsRequests();

```
### Get Subject rights request by id

Gets a Subject rights request by id

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const request = await graph.compliance.subjectRightsRequests.getById('efee1b77-fb3b-4f65-99d6-274c11914d12')();

```
### Create a Subject rights request

Creates a new Subject rights request

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const requestAdd = await graph.compliance.subjectRightsRequests.add({
"type": "export",
"contentQuery": "((\"Diego Siciliani\" OR \"[email protected]\") OR (participants:\"[email protected]\"))",
"dataSubjectType": "customer",
"externalId": "F53BF2DA-607D-412A-B568-FAA0F023AC0B",
"displayName": "Export report for customer Id: 12345",
"description": "This is a export request",
"includeAllVersions": false,
"includeAuthoredContent": true,
"internalDueDateTime": "2022-07-20T22:42:28Z",
"dataSubject": {
"firstName": "Diego",
"lastName": "Siciliani",
"email": "[email protected]",
"residency": "USA"
},
"mailboxLocations": null,
"pauseAfterEstimate": true,
"regulations": [
"CCPA"
],
"siteLocations": {
"@odata.type": "microsoft.graph.subjectRightsRequestAllSiteLocation"
}
});

```
### Update Subject rights request

Updates a Subject rights request

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const requestUpdate = await graph.compliance.subjectRightsRequests.getById('efee1b77-fb3b-4f65-99d6-274c11914d12').update({
description:"Updated description of request",
displayName:"Updated name of request",
internalDueDateTime:"2024-08-20T22:42:28Z"
});

```
### Get Subject rights request notes

Retrieves Subject rights request notes

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const notes = await graph.compliance.subjectRightsRequests.getById('efee1b77-fb3b-4f65-99d6-274c11914d12').notes();

```
### Create new Subject rights request note

Creates a new Subject rights request note

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const notes = await graph.compliance.subjectRightsRequests.getById('efee1b77-fb3b-4f65-99d6-274c11914d12').notes.add(
{
"content": {
"content": "Please take a look at the files tagged with follow up 1",
"contentType": "text"
}
});

```
### Get final report

Get the final report for a Subject rights request. The report is a text file that contains information about the files that were included by the privacy administrator.

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const finalReport = await graph.compliance.subjectRightsRequests.getById('efee1b77-fb3b-4f65-99d6-274c11914d12').finalReport();

```
### Get final attachment

Get the final attachment for a Subject rights request. The attachment is a zip file that contains all the files that were included by the privacy administrator.

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/compliance"

const graph = graphfi(...);

const finalAttachment = await graph.compliance.subjectRightsRequests.getById('efee1b77-fb3b-4f65-99d6-274c11914d12').finalAttachment();

```
27 changes: 27 additions & 0 deletions packages/graph/compliance/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { GraphFI } from "../fi.js";
import { Compliance, ICompliance} from "./types.js";

export {
Compliance,
ICompliance,
Notes,
INotes,
SubjectRightsRequests,
ISubjectRightsRequests,
SubjectRightsRequest,
ISubjectRightsRequest,
} from "./types.js";

declare module "../fi" {
interface GraphFI {
readonly compliance: ICompliance;
}
}

Reflect.defineProperty(GraphFI.prototype, "compliance", {
configurable: true,
enumerable: true,
get: function (this: GraphFI) {
return this.create(Compliance);
},
});
74 changes: 74 additions & 0 deletions packages/graph/compliance/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import {
Privacy as IPrivacyType,
SubjectRightsRequest as ISubjectRightsRequestType,
AuthoredNote as IAuthoredNoteType,
ItemBody as ItemBodyType } from "@microsoft/microsoft-graph-types";
import { _GraphCollection, graphInvokableFactory, _GraphInstance, graphGet, _GraphQueryable, GraphQueryable } from "../graphqueryable.js";
import { IAddable, IGetById, IUpdateable, addable, defaultPath, getById, updateable } from "../decorators.js";
import { BlobParse } from "@pnp/queryable/index.js";

/**
* Compliance
*/
@defaultPath("security")
export class _Compliance extends _GraphQueryable<IPrivacyType> {
/**
* Get subject rights requests
*
*/
public get subjectRightsRequests(): ISubjectRightsRequests {
return SubjectRightsRequests(this);
}

}
export interface ICompliance extends _Compliance {}
export const Compliance = graphInvokableFactory<ICompliance>(_Compliance);

/**
* SubjectRightsRequest
*/
@defaultPath("/")
@updateable()
export class _SubjectRightsRequest extends _GraphInstance<ISubjectRightsRequestType> {
/**
* Get the final report for a subject rights request as a Blob
*/
public async finalReport(): Promise<Blob>{
return graphGet(GraphQueryable(this, "getFinalReport").using(BlobParse()));
}

/**
* Get the final attachment for a subject rights request as a Blob
*/
public async finalAttachment(): Promise<Blob>{
return graphGet(GraphQueryable(this, "getFinalAttachment").using(BlobParse()));
}

/**
* Get the list of authored notes assoicated with a subject rights request.
*/
public get notes(): INotes {
return Notes(this);
}
}
export interface ISubjectRightsRequest extends _SubjectRightsRequest, IUpdateable<ISubjectRightsRequestType> { }
export const SubjectRightsRequest = graphInvokableFactory<ISubjectRightsRequest>(_SubjectRightsRequest);

/**
* SubjectRightsRequests
*/
@defaultPath("subjectRightsRequests")
@getById(SubjectRightsRequest)
@addable()
export class _SubjectRightsRequests extends _GraphCollection<ISubjectRightsRequestType[]> {}
export interface ISubjectRightsRequests extends _SubjectRightsRequests, IGetById<ISubjectRightsRequest>, IAddable<ISubjectRightsRequestType, ISubjectRightsRequestType> {}
export const SubjectRightsRequests = graphInvokableFactory<ISubjectRightsRequests>(_SubjectRightsRequests);

/**
* Notes
*/
@defaultPath("notes")
@addable()
export class _Notes extends _GraphCollection<IAuthoredNoteType[]> {}
export interface INotes extends _Notes, IAddable<ItemBodyType, IAuthoredNoteType> {}
export const Notes = graphInvokableFactory<INotes>(_Notes);
14 changes: 14 additions & 0 deletions test/graph/compliance.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import "@pnp/graph/teams";
import "@pnp/graph/compliance";

describe("Compliance", function () {

before(async function () {
// currently not supported for app only. Keeping this test here for a placeholder.
this.skip();

if (!this.pnp.settings.enableWebTests) {
this.skip();
}
});
});
Loading