myria-core-sdk
Version:
Latest version SDK
376 lines (350 loc) • 24.2 kB
JavaScript
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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