53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
/**
|
|
* Native Teams file card attachments for Bot Framework.
|
|
*
|
|
* The Bot Framework SDK supports `application/vnd.microsoft.teams.card.file.info`
|
|
* content type which produces native Teams file cards.
|
|
*
|
|
* @see https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4
|
|
*/
|
|
|
|
import type { DriveItemProperties } from "./graph-upload.js";
|
|
|
|
/**
|
|
* Build a native Teams file card attachment for Bot Framework.
|
|
*
|
|
* This uses the `application/vnd.microsoft.teams.card.file.info` content type
|
|
* which is supported by Bot Framework and produces native Teams file cards
|
|
* (the same display as when a user manually shares a file).
|
|
*
|
|
* @param file - DriveItem properties from getDriveItemProperties()
|
|
* @returns Attachment object for Bot Framework sendActivity()
|
|
*/
|
|
export function buildTeamsFileInfoCard(file: DriveItemProperties): {
|
|
contentType: string;
|
|
contentUrl: string;
|
|
name: string;
|
|
content: {
|
|
uniqueId: string;
|
|
fileType: string;
|
|
};
|
|
} {
|
|
// Extract unique ID from eTag (remove quotes, braces, and version suffix)
|
|
// Example eTag formats: "{GUID},version" or "\"{GUID},version\""
|
|
const rawETag = file.eTag;
|
|
const uniqueId = rawETag
|
|
.replace(/^["']|["']$/g, "") // Remove outer quotes
|
|
.replace(/[{}]/g, "") // Remove curly braces
|
|
.split(",")[0] ?? rawETag; // Take the GUID part before comma
|
|
|
|
// Extract file extension from filename
|
|
const lastDot = file.name.lastIndexOf(".");
|
|
const fileType = lastDot >= 0 ? file.name.slice(lastDot + 1).toLowerCase() : "";
|
|
|
|
return {
|
|
contentType: "application/vnd.microsoft.teams.card.file.info",
|
|
contentUrl: file.webDavUrl,
|
|
name: file.name,
|
|
content: {
|
|
uniqueId,
|
|
fileType,
|
|
},
|
|
};
|
|
}
|