Files
alighasami 3d5eaf9445
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
first commit
2026-03-17 16:22:57 +03:30

251 lines
6.0 KiB
TypeScript

import type {
IDataObject,
ILoadOptionsFunctions,
INodeListSearchItems,
INodeListSearchResult,
} from 'n8n-workflow';
import type { IDriveItem, IList, IListItem, ISite } from '../helpers/interfaces';
import { escapeFilterValue } from '../helpers/utils';
import { microsoftSharePointApiRequest } from '../transport';
export async function getFiles(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
const site = this.getNodeParameter('site', undefined, { extractValue: true }) as string;
const folder = this.getNodeParameter('folder', undefined, { extractValue: true }) as string;
let response: any;
if (paginationToken) {
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/drive/items/${folder}/children`,
{},
undefined,
undefined,
paginationToken,
);
} else {
// File filter not supported
// https://learn.microsoft.com/en-us/onedrive/developer/rest-api/concepts/filtering-results?view=odsp-graph-online#filterable-properties
const qs: IDataObject = {
$select: 'id,name,file',
};
if (filter) {
qs.$filter = `startswith(name, '${escapeFilterValue(filter)}')`;
}
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/drive/items/${folder}/children`,
{},
qs,
);
}
const items: IDriveItem[] = response.value;
const results: INodeListSearchItems[] = items
.filter((x) => x.file)
.map((g) => ({
name: g.name,
value: g.id,
}))
.sort((a, b) =>
a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }),
);
return { results, paginationToken: response['@odata.nextLink'] };
}
export async function getFolders(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
const site = this.getNodeParameter('site', undefined, { extractValue: true }) as string;
let response: any;
if (paginationToken) {
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/drive/items`,
{},
undefined,
undefined,
paginationToken,
);
} else {
const qs: IDataObject = {
$select: 'id,name,folder',
// Folder filter not supported, but filter is still required
// https://learn.microsoft.com/en-us/onedrive/developer/rest-api/concepts/filtering-results?view=odsp-graph-online#filterable-properties
$filter: 'folder ne null',
};
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/drive/items`,
{},
qs,
);
}
const items: IDriveItem[] = response.value;
const results: INodeListSearchItems[] = items
.filter((x) => x.folder && (!filter || x.name?.toLowerCase()?.includes?.(filter.toLowerCase())))
.map((g) => ({
name: g.name,
value: g.id,
}))
.sort((a, b) =>
a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }),
);
return { results, paginationToken: response['@odata.nextLink'] };
}
export async function getItems(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
const site = this.getNodeParameter('site', undefined, { extractValue: true }) as string;
const list = this.getNodeParameter('list', undefined, { extractValue: true }) as string;
let response: any;
if (paginationToken) {
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/lists/${list}/items`,
{},
undefined,
undefined,
paginationToken,
);
} else {
const qs: IDataObject = {
$expand: 'fields(select=Title)',
$select: 'id,fields',
};
if (filter) {
qs.$filter = `fields/Title eq '${escapeFilterValue(filter)}'`;
}
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/lists/${list}/items`,
{},
qs,
);
}
const items: IListItem[] = response.value;
const results: INodeListSearchItems[] = items
.map((g) => ({
name: g.fields.Title ?? g.id,
value: g.id,
}))
.sort((a, b) =>
a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }),
);
return { results, paginationToken: response['@odata.nextLink'] };
}
export async function getLists(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
const site = this.getNodeParameter('site', undefined, { extractValue: true }) as string;
let response: any;
if (paginationToken) {
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/lists`,
{},
undefined,
undefined,
paginationToken,
);
} else {
const qs: IDataObject = {
$select: 'id,displayName',
};
if (filter) {
qs.$filter = `displayName eq '${escapeFilterValue(filter)}'`;
}
response = await microsoftSharePointApiRequest.call(
this,
'GET',
`/sites/${site}/lists`,
{},
qs,
);
}
const lists: IList[] = response.value;
const results: INodeListSearchItems[] = lists
.map((g) => ({
name: g.displayName,
value: g.id,
}))
.sort((a, b) =>
a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }),
);
return { results, paginationToken: response['@odata.nextLink'] };
}
export async function getSites(
this: ILoadOptionsFunctions,
filter?: string,
paginationToken?: string,
): Promise<INodeListSearchResult> {
let response: any;
if (paginationToken) {
response = await microsoftSharePointApiRequest.call(
this,
'GET',
'/sites',
{},
undefined,
undefined,
paginationToken,
);
} else {
const qs: IDataObject = {
$select: 'id,title',
$search: '*',
};
if (filter) {
qs.$search = filter;
}
response = await microsoftSharePointApiRequest.call(this, 'GET', '/sites', {}, qs);
}
const sites: ISite[] = response.value;
const results: INodeListSearchItems[] = sites
.map((g) => ({
name: g.title,
value: g.id,
}))
.sort((a, b) =>
a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }),
);
return { results, paginationToken: response['@odata.nextLink'] };
}