-2

I want to reduce the throughput value of existing azure cosmos db collection using this rest API and it's giving a bad/unauthorized error. Kindly help me calling the API with proper input.

https://learn.microsoft.com/en-us/rest/api/cosmos-db/replace-an-offer

Nadhas
  • 5,421
  • 2
  • 28
  • 42

2 Answers2

0

You need to provide authorization header

type={typeoftoken}&ver={tokenversion}&sig={hashsignature}  
Vova Bilyachat
  • 18,765
  • 4
  • 55
  • 80
0

To start from replaceThroughput method

const replaceThroughput = async(req, res, next) => {
    let collectionName = _.get(req, 'headers.collectionname');
    let offerThroughput = _.get(req, 'headers.offerthroughput');
    const container = await cosmosClient.database(process.env.COSMOS_DB_NAME).container(collectionName);
    let containerResponse = await container.read().catch((error)=>{
        let err = new Error();
        err.statusCode = 404;
        err.message = 'Collection not found';
        next(err);
        return;
    });
    let resourceId = _.get(containerResponse, 'body._rid', '');
    console.log(resourceId)
    let offerPayload = await getOfferPayload(resourceId);
    _.set(offerPayload, 'content.offerThroughput', offerThroughput);
    let offerResponse = await replaceOfferThroughput(offerPayload.id, offerPayload);
    if (offerResponse.error) {
        let err = new Error();
        err.statusCode = 500;
        err.message = 'Replace resource offer failed';
        err.data = offerResponse.error;
        next(err);
        return;
    } else {
        res.end(JSON.stringify({'result': 'success', 'message': 'throughput updated', 'data': offerResponse}));
    }
    next();
};

const getOfferPayload = async (resourceId) => {
    var dateString = new Date().toUTCString();
    let authString = getAuthorizationTokenUsingMasterKey('GET','offers', '', dateString, process.env.COSMOS_DB_KEY);
    const options = {
        method: 'GET',
        rejectUnauthorized: false,
        uri: 'https://' + process.env.COSMOS_DB_NAME + '.documents.azure.com/offers',
        headers: {
            'x-ms-version': '2018-06-18',
            'Authorization': authString,
            'x-ms-date': dateString
        }
    };
    try{
        let response = await request(options);
        response = JSON.parse(response);
        response = _.filter(response.Offers, {offerResourceId: resourceId});
        return response[0];
    }catch(err){
        return err;
    }
};

const replaceOfferThroughput = async (offerResourceId, offerPayload) => {
    var dateString = new Date().toUTCString();
    let authString = getAuthorizationTokenUsingMasterKey('PUT','offers', offerResourceId, dateString, process.env.COSMOS_DB_KEY);
    const options = {
        method: 'PUT',
        body: offerPayload,
        json: true,
        rejectUnauthorized: false,
        uri: 'https://' + process.env.COSMOS_DB_NAME + '.documents.azure.com/offers/'+ offerResourceId,
        headers: {
            'x-ms-version': '2018-06-18',
            'Authorization': authString,
            'x-ms-date': dateString
        }
    };
    try{
        return await request(options);
    }catch(err){
        return err;
    }
};

const getAuthorizationTokenUsingMasterKey = (verb, resourceType, resourceId, date, masterKey) => {
    var key =  Buffer.from(masterKey, "base64");
    var text = (verb || "").toLowerCase() + "\n" +
        (resourceType || "").toLowerCase() + "\n" +
        (resourceId || "").toLowerCase() + "\n" +
        date.toLowerCase() + "\n" +
        "" + "\n";
    var body = Buffer.from(text, "utf8");
    var signature = crypto.createHmac("sha256", key).update(body).digest("base64");
    var MasterToken = "master";
    var TokenVersion = "1.0";
    return encodeURIComponent("type=" + MasterToken + "&ver=" + TokenVersion + "&sig=" + signature);
}

To Create Connection

const CosmosClient = require("@azure/cosmos").CosmosClient;
 cosmosClient = new CosmosClient({
        endpoint: process.env.COSMOS_DB_URL,
        auth: {
            masterKey: process.env.COSMOS_DB_KEY
        }
    });
Nadhas
  • 5,421
  • 2
  • 28
  • 42