Skip to content

Commit 0f97825

Browse files
committed
improve/fix attachment related methods
1 parent 0bd5dce commit 0f97825

File tree

1 file changed

+47
-23
lines changed

1 file changed

+47
-23
lines changed

src/services/SPService.ts

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ISPService, ILibsOptions, LibsOrderBy } from "./ISPService";
22
import { ISPLists } from "../common/SPEntities";
33
import { WebPartContext } from "@microsoft/sp-webpart-base";
44
import { ExtensionContext } from "@microsoft/sp-extension-base";
5-
import { SPHttpClient, SPHttpClientResponse,ISPHttpClientOptions } from "@microsoft/sp-http";
5+
import { SPHttpClient, SPHttpClientResponse, ISPHttpClientOptions } from "@microsoft/sp-http";
66
import { sp, Web } from '@pnp/sp';
77

88
export default class SPService implements ISPService {
@@ -63,24 +63,25 @@ export default class SPService implements ISPService {
6363
}
6464
}
6565

66-
/**
67-
* Get list item attachments
68-
*
69-
* @param listId
70-
* @param itemId
71-
* @param webUrl
72-
*/
73-
public async getListItemAttachments(listId: string, itemId: number, webUrl?: string): Promise<any[]> {
66+
/**
67+
* Get list item attachments
68+
*
69+
* @param listId
70+
* @param itemId
71+
* @param webUrl
72+
*/
73+
public async getListItemAttachments(listId: string, itemId: number, webUrl?: string): Promise<any[]> {
7474
try {
7575
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
76-
const apiUrl = `${webAbsoluteUrl}/_api/web/lists('${listId}')/items(${itemId})/AttachmentFiles`;
76+
const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/items(@itemId)/AttachmentFiles?@listId=guid'${encodeURIComponent(listId)}'&@itemId=${encodeURIComponent(String(itemId))}`;
7777
const data = await this._context.spHttpClient.get(apiUrl, SPHttpClient.configurations.v1);
7878
if (data.ok) {
7979
const results = await data.json();
8080
if (results && results.value && results.value.length > 0) {
8181
return results.value;
8282
}
8383
}
84+
8485
return null;
8586
} catch (error) {
8687
console.dir(error);
@@ -102,7 +103,7 @@ export default class SPService implements ISPService {
102103
headers: { "X-HTTP-Method": 'DELETE', }
103104
};
104105
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
105-
const apiUrl = `${webAbsoluteUrl}/_api/web/lists('${listId}')/items(${itemId})/AttachmentFiles/getByFileName('${encodeURIComponent(fileName)}')`;
106+
const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/items(@itemId)/AttachmentFiles/getByFileName(@fileName)?@listId=guid'${encodeURIComponent(listId)}'&@itemId=${encodeURIComponent(String(itemId))}&@fileName='${encodeURIComponent(fileName.replace(/'/g, "''"))}'`;
106107
const data = await this._context.spHttpClient.post(apiUrl, SPHttpClient.configurations.v1, spOpts);
107108
} catch (error) {
108109
console.dir(error);
@@ -121,20 +122,20 @@ export default class SPService implements ISPService {
121122
*/
122123
public async addAttachment(listId: string, itemId: number, fileName: string, file: File, webUrl?: string): Promise<void> {
123124
try {
124-
// remove special characteres in FileName
125+
// Remove special characters in FileName
125126
fileName = fileName.replace(/[^\.\w\s]/gi, '');
126-
// Check if Attachment Exists
127+
// Check if attachment exists
127128
const fileExists = await this.checkAttachmentExists(listId, itemId, fileName, webUrl);
128-
// Delete Attachment if exists
129+
// Delete attachment if it exists
129130
if (fileExists) {
130131
await this.deleteAttachment(fileName, listId, itemId, webUrl);
131132
}
132-
// Add Attachment
133+
// Add attachment
133134
const spOpts: ISPHttpClientOptions = {
134135
body: file
135136
};
136137
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
137-
const apiUrl = `${webAbsoluteUrl}/_api/web/lists('${listId}')/items(${itemId})/AttachmentFiles/add(FileName='${encodeURIComponent(fileName)}')`;
138+
const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/items(@itemId)/AttachmentFiles/add(FileName=@fileName)?@listId=guid'${encodeURIComponent(listId)}'&@itemId=${encodeURIComponent(String(itemId))}&@fileName='${encodeURIComponent(fileName.replace(/'/g, "''"))}'`;
138139
const data = await this._context.spHttpClient.post(apiUrl, SPHttpClient.configurations.v1, spOpts);
139140
return;
140141
} catch (error) {
@@ -152,14 +153,15 @@ export default class SPService implements ISPService {
152153
*/
153154
public async getAttachment(listId: string, itemId: number, fileName: string, webUrl?: string): Promise<any> {
154155
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
155-
const apiUrl = `${webAbsoluteUrl}/_api/web/lists('${listId}')/items(${itemId})/AttachmentFiles/GetByFileBame('${fileName}'))`;
156+
const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/items(@itemId)/AttachmentFiles/GetByFileBame(@fileName))?@listId=guid'${encodeURIComponent(listId)}'&@itemId=${encodeURIComponent(String(itemId))}&@fileName='${encodeURIComponent(fileName.replace(/'/g, "''"))}'`;
156157
const data = await this._context.spHttpClient.get(apiUrl, SPHttpClient.configurations.v1);
157158
if (data.ok) {
158159
const file = await data.json();
159160
if (file) {
160161
return file;
161162
}
162163
}
164+
163165
return null;
164166
}
165167

@@ -173,14 +175,15 @@ export default class SPService implements ISPService {
173175
*/
174176
public async checkAttachmentExists(listId: string, itemId: number, fileName: string, webUrl?: string): Promise<any> {
175177
try {
176-
const listName = await this.getListName(listId, webUrl);
178+
const listServerRelativeUrl = await this.getListServerRelativeUrl(listId, webUrl);
177179
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
178-
const apiUrl = `${webAbsoluteUrl}/_api/web/getfilebyserverrelativeurl('/lists/${listName}/Attachments/${itemId}/${fileName}')`;
180+
const fileServerRelativeUrl = `${listServerRelativeUrl}/Attachments/${itemId}/${fileName}`;
181+
const apiUrl = `${webAbsoluteUrl}/_api/web/getfilebyserverrelativeurl(@url)/Exists?@url='${encodeURIComponent(fileServerRelativeUrl.replace(/'/g, "''"))}'`;
179182
const data = await this._context.spHttpClient.get(apiUrl, SPHttpClient.configurations.v1);
180183
if (data.ok) {
181184
const results = await data.json();
182-
if (results && results.Exists) {
183-
return results.Exists;
185+
if (results) {
186+
return results.value;
184187
}
185188
}
186189

@@ -198,14 +201,35 @@ export default class SPService implements ISPService {
198201
*/
199202
public async getListName(listId: string, webUrl?: string): Promise<string> {
200203
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
201-
const apiUrl = `${webAbsoluteUrl}/_api/web/lists('${listId}')?$select=RootFolder/Name&$expand=RootFolder)`;
204+
const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/RootFolder/Name?@listId=guid'${encodeURIComponent(listId)}'`;
205+
const data = await this._context.spHttpClient.get(apiUrl, SPHttpClient.configurations.v1);
206+
if (data.ok) {
207+
const results = await data.json();
208+
if (results) {
209+
return results.value;
210+
}
211+
}
212+
213+
return;
214+
}
215+
216+
/**
217+
* Get the list server relative url
218+
*
219+
* @param listId
220+
* @param webUrl
221+
*/
222+
public async getListServerRelativeUrl(listId: string, webUrl?: string): Promise<string> {
223+
const webAbsoluteUrl = !webUrl ? this._context.pageContext.web.absoluteUrl : webUrl;
224+
const apiUrl = `${webAbsoluteUrl}/_api/web/lists(@listId)/RootFolder/ServerRelativeUrl?@listId=guid'${encodeURIComponent(listId)}'`;
202225
const data = await this._context.spHttpClient.get(apiUrl, SPHttpClient.configurations.v1);
203226
if (data.ok) {
204227
const results = await data.json();
205228
if (results) {
206-
return results.RootFolder.Name;
229+
return results.value;
207230
}
208231
}
232+
209233
return;
210234
}
211235
}

0 commit comments

Comments
 (0)