import IJitzContext from "../interfaces/IJitzContext"; import IJitzSPContext from "../interfaces/IJitzSPContext"; import { IList } from "../interfaces/IList"; import { IModel } from "../interfaces/IModels"; import { IRepository } from "../interfaces/IRepository"; import Repository from "./Repository"; interface BigObject { [index: string]: T; } export default class List implements IList { context: IJitzSPContext; listName: string; listGuid: string; // _listId: string; _nextPageLink: string; // items: any[]; top: number = 100; indexLimit: number = 5000; simpleFields: string[] = []; userTypeFields: string[] = []; lookUpFields: string[] = []; additionalExpandFields: string[] = []; repository: IRepository; filters?: string = ""; upperId: number = 0; lowerId: number = 0; orderBy?: string | undefined; constructor( jitzSPContext: IJitzSPContext, listName: string, simpleFields: string[], userTypeFields: string[], lookUpFields: string[], additionalExpandFields: string[], listGuid: string = "" ) { this.context = jitzSPContext; this.listName = listName; this.listGuid = listGuid; this.simpleFields = simpleFields || []; this.userTypeFields = userTypeFields || []; this.lookUpFields = lookUpFields || []; this.additionalExpandFields = additionalExpandFields || []; this.repository = new Repository(this.context, listName, listGuid); } getItems = async ( filters?: string, orderby?: string, top?: number, skip?: number ): Promise => { this.top = top || this.top; let items: T[] = []; var expandFields = ( [...this.lookUpFields, ...this.userTypeFields] || [] ).join(","); var selectFields = this.getSelectFieldsForSharePointApi(); this.filters = filters; this.orderBy = orderby; var response: any = await this.repository.getAll( selectFields, expandFields, filters, orderby, top || this.top, skip ); this._nextPageLink = response.__next || ""; // console.log(items); // this.items = items; return response.results; }; loadMore = async (): Promise => { try { if (this._nextPageLink != undefined && this._nextPageLink.length > 0) { let items: T[] = []; var expandFields = ( [...this.lookUpFields, ...this.userTypeFields] || [] ).join(","); var selectFields = this.getSelectFieldsForSharePointApi(); var response: any = await this.repository.getAllFromUrl( this._nextPageLink ); this._nextPageLink = response.__next || ""; // console.log(items); // this.items = items; return response.results; } } catch {} return []; }; getItemsIndexed = async ( filterQuery?: string, orderby?: string, top?: number ): Promise => { this.top = top || this.top; let filter: string = "(Id ge 1)"; this.orderBy = orderby; this.filters = filterQuery; //Find latest Id await this.repository .getAll("*", "", "", `Id desc`, 1) .then((datacount: any) => { if (datacount?.results?.length > 0) { this.upperId = datacount.results[0].Id; } }); this.lowerId = this.getLowerId(this.upperId); if (this.upperId > 1) filter = `(Id gt ${this.lowerId} and Id le ${this.upperId})`; filterQuery = `${filter} ${ filterQuery != undefined && filterQuery.length > 0 ? `and ${filterQuery}` : "" }`; var results = await this.getData(filterQuery); return results; }; public async loadMoreIndexed(): Promise { if (this._nextPageLink != undefined && this._nextPageLink.length > 0) { var response: any = await this.repository.getAllFromUrl( this._nextPageLink ); this._nextPageLink = response.__next || ""; return response.results; } else { var filter = ""; this.upperId = this.lowerId; this.lowerId = this.getLowerId(this.upperId); if (this.upperId > 1) { filter = `(Id gt ${this.lowerId} and Id le ${this.upperId})`; if (this.filters != undefined && this.filters.length > 0) filter = `${filter} and ${this.filters}`; // console.log(filter); var results = await this.getData(filter); return results; } else return []; } } getItemsIndexedRecursive = async (filter: string): Promise => { var results = await this.getItemsIndexed(filter); var moreData: any[] = await this.continueFetch(); results = [...results, ...moreData]; return results; }; continueFetch = async () => { var data: any[] = []; try { data = await this.loadMoreIndexed(); if (this.lowerId > 0) { var moreData: any[] = await this.continueFetch(); data = [...data, ...moreData]; } } catch {} return data; }; getData = async (filter: string): Promise => { var expandFields = ( [...this.lookUpFields, ...this.userTypeFields] || [] ).join(","); var selectFields = this.getSelectFieldsForSharePointApi(); var response: any = await this.repository.getAll( selectFields, expandFields, filter, this.orderBy || `Id desc`, this.top ); this._nextPageLink = response.__next || ""; return response.results as T[]; }; private getLowerId = (upperId: number): number => { if (upperId > this.indexLimit) return upperId - this.indexLimit; else return 0; }; getItemById = async (id: number): Promise => { var item: any; var expandFields = ( [...this.lookUpFields, ...this.userTypeFields] || [] ).join(","); var selectFields = this.getSelectFieldsForSharePointApi(); item = await this.repository.getItemById(id, selectFields, expandFields); return item; }; getItemsRecursive = async ( filters?: string, orderby?: string, top: number = 5000, maxRecursiveCount: number = 5 ): Promise => { let items: T[] = []; var expandFields = ( [...this.lookUpFields, ...this.userTypeFields] || [] ).join(","); var selectFields = this.getSelectFieldsForSharePointApi(); items = await this.repository.getAllRecursive( selectFields, expandFields, filters, orderby, top || this.top, maxRecursiveCount ); // console.log(items); // this.items = items; return items; }; getItemsCount = async (filters?: string): Promise => { var count = await this.repository.itemsCount(filters); return count; }; create = async (item: T): Promise => { var newItem = this.setPropertiesForSharePointApi(item); item = await this.repository.createItem(newItem); // await this.context.graphClient // .api(`/sites/${this.context.siteId}/lists/${this.listName}/items`) // .post({ fields: item }) // .then((response: any) => { // item = response; // }) // .catch((err) => { // console.log(err); // }); item = (item as any)?.data?.d || (item as any)?.data || item; return item; }; update = async (item: T): Promise => { var newItem = this.setPropertiesForSharePointApi(item); item = await this.repository.updateItem(newItem); // let newObject: any = {}; // var itemAsAny = item as any; // Object.keys(itemAsAny).forEach((key) => { // if ((key || "").toString().toLowerCase() != "id") // newObject[key] = itemAsAny[key]; // }); // await this.context.graphClient // .api( // `/sites/${this.context.siteId}/lists/${this.listName}/items/${item.Id}/fields` // ) // .update(newObject) // .then((response: any) => { // item = response; // }) // .catch((err) => { // console.log(err); // }); item = (item as any)?.data?.d || (item as any)?.data || item; return item; }; delete = async (id: number): Promise => { var result = await this.repository.deleteItem(id); // await this.context.graphClient // .api(`/sites/${this.context.siteId}/lists/${this.listName}/items/${id}`) // .delete() // .then((response: any) => { // result = true; // }) // .catch((err) => { // console.log(err); // }); return result; }; // getItems = async ( // filter?: string[], // orderby?: string, // top?: number // ): Promise => { // let items: T[] = []; // var expandFields = ( // [...this.lookUpFields, ...this.userTypeFields] || [] // ).join(","); // try { // var selectFields = this.getSelectFieldsForGraphApi(); // await this.context.graphClient // .api( // `/sites/${this.context.siteId}/lists/${ // this.listName // }/items?expand=fields(select=${selectFields})&top=${top || this.top}` // ) // .get((err, res) => { // if (err) { // console.log(err); // return items; // } // if ( // res != undefined && // res["@odata.context"] != undefined && // res.value != undefined && // res.value.length > 0 // ) { // console.log(res.value); // for (var i = 0; i < res.value.length; i++) { // var item = { // Id: res.value[i].id, // Title: res.value[i].fields["Title"], // }; // items.push(item as T); // } // console.log(items); // } // }); // } catch { // var selectFields = this.getSelectFieldsForSharePointApi(); // items = await this.repository.getAll(selectFields, expandFields); // console.log(items); // } // this.items = items; // return items; // }; // getItemById = async (id: number): Promise => { // var item: any; // try { // await this.context.graphClient // .api(`/sites/${this.context.siteId}/lists/${this.listName}/items/${id}`) // .get() // .then((response: any) => { // // console.log(response); // item = response.fields; // }) // .catch((err) => { // console.log(err); // }); // } catch { // item = await this.repository.getItemById(id); // } // return item; // }; private setPropertiesForSharePointApi = (item: any): any => { var newItem: any = {}; Object.keys(item).forEach((e) => { // console.log(`key=${e} value=${item[e]}`); var keyText = (e || "").split("Lookup").join(""); newItem[keyText] = item[e]; }); return newItem; }; private getSelectFieldsForSharePointApi = (): string => { var selectFields = ""; var userTypeFields: string[] = []; var lookUpFields: string[] = []; var additionalExpandFields: string[] = []; if (this.userTypeFields.length > 0) { for (var i = 0; i < this.userTypeFields.length; i++) { userTypeFields.push(`${this.userTypeFields[i]}Id`); userTypeFields.push(`${this.userTypeFields[i]}/Id`); userTypeFields.push(`${this.userTypeFields[i]}/Name`); userTypeFields.push(`${this.userTypeFields[i]}/Title`); userTypeFields.push(`${this.userTypeFields[i]}/EMail`); } } if (this.lookUpFields.length > 0) { for (var i = 0; i < this.lookUpFields.length; i++) { if (this.lookUpFields[i] == "File") { lookUpFields.push(`${this.lookUpFields[i]}/Name`); lookUpFields.push(`${this.lookUpFields[i]}/ServerRelativeUrl`); } else { lookUpFields.push(`${this.lookUpFields[i]}`); lookUpFields.push(`${this.lookUpFields[i]}Id`); lookUpFields.push(`${this.lookUpFields[i]}/Id`); lookUpFields.push(`${this.lookUpFields[i]}/Title`); } } } if (this.additionalExpandFields.length > 0) { for (var i = 0; i < this.additionalExpandFields.length; i++) { additionalExpandFields.push(this.additionalExpandFields[i]); } } selectFields = ( [ ...this.simpleFields, ...userTypeFields, ...lookUpFields, ...additionalExpandFields, ] || [] ).join(","); return selectFields; }; private getSelectFieldsForGraphApi = (): string => { var selectFields = ""; var userTypeFields: string[] = []; var lookUpFields: string[] = []; if (this.userTypeFields.length > 0) { for (var i = 0; i < this.userTypeFields.length; i++) { userTypeFields.push(`${this.userTypeFields[0]}LookupId`); userTypeFields.push(`${this.userTypeFields[0]}`); userTypeFields.push(`${this.userTypeFields[0]}EMail`); } } if (this.lookUpFields.length > 0) { for (var i = 0; i < this.lookUpFields.length; i++) { lookUpFields.push(`${this.lookUpFields[0]}`); lookUpFields.push(`${this.lookUpFields[0]}LookupId`); } } selectFields = ( [...this.simpleFields, ...userTypeFields, ...lookUpFields] || [] ).join(","); return selectFields; }; // private checkGraphApiPermission = async () => { // try { // this.context.graphClient // .api( // `/sites/${this.context.siteId}/lists/${this.listName}/items?expand=fields&top=1` // ) // .get((err, res) => { // if (err) { // console.log(err); // this.hasGraphApiPermission = false; // return err; // } // if (res != undefined && res["@odata.context"] != undefined) { // console.log(res); // this.hasGraphApiPermission = true; // } // return res; // }); // } catch { // this.hasGraphApiPermission = false; // } // }; }