UNPKG

myria-core-sdk

Version:

Latest version SDK

376 lines (350 loc) 24.2 kB
import { ProjectAPI } from "../core/apis/project.api"; /** * Create ProjectManager module * @class ProjectManager * @param {EnvTypes} env Environment type (DEV / STAGING / PREPROD / PROD) * @example <caption>ProjectManager Instantiation</caption> const projectManager = new ProjectManager(EnvTypes.STAGING); * */ export class ProjectManager { constructor(env) { this.projectAPI = new ProjectAPI(env); } /** * @summary Get project details information by project ID and api key * @param {number} id unique ID of project * @param {string} apiKey api key of project * @returns {ProjectResponse} Project details information (basic info of project, number of collections allow....) * @throws {string} Exception: Project id is required * @example <caption>Sample of getProjectDetails(id) on Staging env</caption> const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const projectId = 1; const apiKey = 'Your api key'; // could generate on the myria portal for partner console.log("Getting project details information..."); const data: projectDetailsInfo = await projectManager.getProjectDetail(projectId, apiKey); console.log("Project details response:"); console.log(JSON.stringify(data, null, 2)); */ async getProjectDetail(id, apiKey) { if (!id) { throw new Error("Project Id is required"); } if (!apiKey) { throw new Error("API Key is required"); } const projectDetail = await this.projectAPI.getProjectDetail(id, apiKey); return projectDetail; } /** * @summary Get project details information by project ID and api key * @param {number} id unique ID of project * @param {string} apiKey api key of project * @returns {ProjectResponse} Project details information (basic info of project, number of collections allow....) * @throws {string} Exception: Project id is required * @example <caption>Sample of getProjectDetails(id) on Staging env</caption> const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const projectPublicId = 1; const apiKey = 'Your api key'; // could generate on the myria portal for partner console.log("Getting project details information..."); const data: CollectionListResponseData = await projectManager.getProjectDetailByPublicID(projectPublicId, apiKey); console.log("Project details response:"); console.log(JSON.stringify(data, null, 2)); */ async getProjectDetailByPublicID(publicId, apiKey) { if (!publicId) { throw new Error("Project Public Id is required"); } if (!apiKey) { throw new Error("API Key is required"); } const projectDetail = await this.projectAPI.getProjectDetailByPublicID(publicId, apiKey); return projectDetail; } /** * @summary Create project by using Myria user Id and API key * @param {CreateProjectParamsByAPIKey} payload Create project request params with API Key * @returns {ProjectResponse} Project details (project basic info, number of collections allow....) * @throws {string} Exception: API Key is required * @throws {string} Exception: Company name is required * @throws {string} Exception: Contact email is required * @throws {string} Exception: Myria User ID is required * @throws {string} Exception: Name is required * @example <caption>Sample of createProjectByApiKey({}) on Staging env</caption> * const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const params: CreateProjectParamsByAPIKey = { name: "Game Project Test", companyName: "GamePartnerWithMyria", contactEmail: "world.game@myria.com", apiKey: 'Your api key', // could generate on the myria portal for partner myriaUserID: 'your unique user ID in myria system', }; console.log("Getting project details information..."); const data: ProjectResponse = await projectManager.createProjectByApiKey(params); console.log("New project details response:"); console.log(JSON.stringify(data, null, 2)); */ async createProjectByApiKey(payload) { if (!payload.apiKey) { throw new Error("API Key is required"); } if (!payload.companyName) { throw new Error("Company name is required"); } if (!payload.contactEmail) { throw new Error("Contact email is required"); } if (!payload.myriaUserID) { throw new Error("Myria User ID is required"); } if (!payload.name) { throw new Error("Name is required"); } const createdProjectResponse = await this.projectAPI.createProjectV2(payload); if ((createdProjectResponse === null || createdProjectResponse === void 0 ? void 0 : createdProjectResponse.status) !== 'success') { throw new Error('Create project failure => ' + JSON.stringify(createdProjectResponse)); } return createdProjectResponse; } /** * @summary Update project by using Myria user Id and API key * @param {UpdateProjectByAPIKey} payload Update project request params * @returns {ProjectResponse} Project details information (basic info of project, number of collections allow....) * @throws {string} Exception: API Key is required * @throws {string} Exception: Company name is required * @throws {string} Exception: Contact email is required * @throws {string} Exception: Myria User ID is required * @throws {string} Exception: Name is required * @throws {string} Http Status Code 500: Create project failure => ${server error} * @example <caption>Sample of updateProjectByApiKey({}) on Staging env</caption> * const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const params: UpdateProjectByAPIKey = { id: 1, name: "Game Project Test", companyName: "GamePartnerWithMyria", contactEmail: "world.game@myria.com", apiKey: 'Your api key', // could generate on the myria portal myriaUserID: 'your unique user ID in myria system', }; console.log("Getting project details information..."); const data: ProjectResponse = await projectManager.updateProjectByApiKey(params); console.log("New project details response:"); console.log(JSON.stringify(data, null, 2)); */ async updateProjectByApiKey(payload) { if (!payload.apiKey) { throw new Error("API Key is required"); } if (!payload.companyName) { throw new Error("Company name is required"); } if (!payload.contactEmail) { throw new Error("Contact email is required"); } if (!payload.myriaUserID) { throw new Error("Myria User ID is required"); } if (!payload.name) { throw new Error("Name is required"); } const updatedProjectResponse = await this.projectAPI.updateProjectV2(payload); if ((updatedProjectResponse === null || updatedProjectResponse === void 0 ? void 0 : updatedProjectResponse.status) !== 'success') { throw new Error('Create project failure => ' + JSON.stringify(updatedProjectResponse)); } return updatedProjectResponse; } /** * @summary Get Project List By Myria User ID and API Key * @param {string} userID Unique ID (uuid) of myria user * @param {string} apiKey Partner's API key * @throws {string} Exception: User ID is required * @throws {string} Exception: Partner API Key is required * @throws {string} Http Status Code 401: x-api-key is not found (x-api-key is required to secure the call to Myria marketplace service) * @throws {string} Http Status Code 403: The API KEY (example: aed.....) is unavailable means the API key is invalid or has been deactivated * @example <caption>Sample of getProjectsByUserIDAndApiKey({}) on Staging env</caption> * const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const myriaUserID = 'uuid myria user ID'; // 'your unique user ID in myria system'; const apiKey = 'Your api key'; // could generate on the myria portal console.log("Getting project list data..."); const data: ProjectResponse = await projectManager.getProjectsByUserIDAndApiKey(myriaUserID, apiKey); console.log("Data project list response:"); console.log(JSON.stringify(data, null, 2)); */ async getProjectsByUserIDAndApiKey(userID, apiKey) { if (!userID) { throw new Error('Myria User ID is required'); } if (!apiKey) { throw new Error('Partner API Key is required'); } const projectData = await this.projectAPI.getProjectsByUserIDAndApiKey(userID, apiKey); if ((projectData === null || projectData === void 0 ? void 0 : projectData.status) !== 'success') { throw new Error("Cannot get project list - internal server error"); } return projectData; } async deleteProjectById(payload) { if (!payload.apiKey) { throw new Error('Partner API Key is required'); } if (!payload.myriaUserID) { throw new Error('Myria User ID is required'); } if (!payload.projectId) { throw new Error('Project ID is required'); } const projectData = await this.projectAPI.deleteProjectById(payload); if ((projectData === null || projectData === void 0 ? void 0 : projectData.status) !== 'success') { throw new Error("Cannot delete project - internal server error"); } projectData.data = true; return projectData; } /** * @summary Create the project by using a Stark key * @param {CreateProjectParams} payload create project request input (companyName / name / contactEmail / Stark key) * @throws {string} Exception: CompanyName is required * @throws {string} Exception: Name is required * @throws {string} Exception: Contact email address is required * @throws {string} Exception: StarkKey is required * @throws {string} Exception: Create project failed with internal server error * @returns {ProjectResponse | undefined} Project information data * @example <caption>Sample of createProject() on testnet environment</caption> * const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const starkKey: string = config.stark_key; // Your stark key in Myria system const params: CreateProjectParams = { name: "Game Project Test", companyName: "GamePartnerWithMyria", contactEmail: "world.game@myria.com", starkKey: starkKey, }; console.log("Creating the project..."); const newProjectResponse: ProjectResponse = await projectManager.createProject(params); console.log("Created project response:"); console.log(JSON.stringify(newProjectResponse, null, 2)); */ async createProject(payload) { if (!payload.companyName) { throw new Error("CompanyName is required"); } if (!payload.name) { throw new Error("Name is required"); } if (!payload.contactEmail) { throw new Error("Contact email address is required"); } if (!payload.starkKey) { throw new Error("StarkKey is required"); } let createProjectData; try { const createProjectResponse = await this.projectAPI.createProject(payload); if ((createProjectResponse === null || createProjectResponse === void 0 ? void 0 : createProjectResponse.status) === "success") { createProjectData = createProjectResponse === null || createProjectResponse === void 0 ? void 0 : createProjectResponse.data; } else { throw new Error("Create project failed with internal server error"); } } catch (error) { throw new Error(error); } return createProjectData; } /** * @summary Update the project by using project ID and the stark key * @param {UpdateProjectParams} payload update projects request input (id / companyName / name / contactEmail / Stark key) * @throws {string} Exception: Project Id is required * @throws {string} Exception: Company name is required * @throws {string} Exception: Name is required * @throws {string} Exception: Contact email address is required * @throws {string} Exception: StarkKey is required * @returns {ProjectResponse | undefined} Project information data * @example <caption>Sample of updateProject({}) on Staging testnet environment</caption> * const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const starkKey: string = config.stark_key; // Your stark key in Myria system const params: UpdateProjectParams = { id: 1, name: "Update Game Project Test", companyName: "GamePartnerWithMyria", contactEmail: "world.game@myria.com", starkKey: starkKey, }; console.log("Update the project..."); const updatedProjectResponse: ProjectResponse = await projectManager.updateProject(params); console.log("Updated project response:"); console.log(JSON.stringify(updatedProjectResponse, null, 2)); */ async updateProject(payload) { if (!payload.id) { throw new Error("Project Id is required"); } if (!payload.companyName) { throw new Error("Company name is required"); } if (!payload.contactEmail) { throw new Error("Contact email address is required"); } if (!payload.name) { throw new Error("Name is required!"); } if (!payload.starkKey) { throw new Error("StarkKey is required!"); } let updateProject; try { const updateProjectResponse = await this.projectAPI.updateProject(payload); if ((updateProjectResponse === null || updateProjectResponse === void 0 ? void 0 : updateProjectResponse.status) === "success") { updateProject = updateProjectResponse === null || updateProjectResponse === void 0 ? void 0 : updateProjectResponse.data; } else { throw new Error("Update project failed with internal server error"); } return updateProject; } catch (err) { throw new Error(err); } } /** * @description Function to get the list of collections by project ID * @param {number} id unique ID of project * @returns {CollectionListResponseData} Project details information which include collection list * @throws {string} Exception: Project id is required * @throws {string} Exception: Get collection list failed with internal server error * @throws {string} Exception: Get collection list failed with ${serverError} * @example <caption>Sample of getCollectionListByProjectId() on Staging env</caption> const projectManager: ProjectManager = new ProjectManager(EnvTypes.STAGING); const starkKey: string = config.stark_key; // Your stark key in Myria system const projectId = 1; console.log("Getting list of the collection..."); const data: CollectionListResponseData = await projectManager.getCollectionListByProjectId(projectId); console.log("List of collection response:"); console.log(JSON.stringify(data, null, 2)); */ async getCollectionListByProjectId(id) { if (!id) { throw new Error('Project id is required!'); } let collectionListInfo; try { const result = await this.projectAPI.getCollectionListByProjectId(id); if (result.status === 'success') { collectionListInfo = result.data; } else { throw new Error('Get collection list failed with internal server error'); } } catch (err) { throw new Error(`Get collection list failed with ${err}`); } return collectionListInfo; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvamVjdE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9Qcm9qZWN0TWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBR3pCLFlBQVksR0FBYTtRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBVSxFQUFFLE1BQWM7UUFFdEQsSUFBRyxDQUFDLEVBQUUsRUFBRTtZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDeEM7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFQzs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpQkM7SUFDTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsUUFBZ0IsRUFBRSxNQUFjO1FBRXRFLElBQUcsQ0FBQyxRQUFRLEVBQUU7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFD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