Skip to content

Commit

Permalink
Merge pull request #2886 from bcameron1231/v4-subjectRightsUseRequests
Browse files Browse the repository at this point in the history
V4 - Compliance
  • Loading branch information
juliemturner authored Jan 12, 2024
2 parents 761d9e5 + 178d3de commit 07a7e39
Show file tree
Hide file tree
Showing 4 changed files with 267 additions and 0 deletions.
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();
}
});
});

0 comments on commit 07a7e39

Please sign in to comment.