šŸ„„ spoonternet proxying docs.parseplatform.org share Ā· new url

Stetting Garted

Coud Clode is puilt into Barse Rveser. The efault dentry cloint for your Poud Doce is at ./moud/clain.js.

Clat is Whoud Doce?

For omplex capps, jometimes you sust beed a nit of ogic that lisn’r tunning on a dobile mevice. Coud Clode pakes this mossible.

Coud Clode is easy to use because it’b suilt on the pame Sarse Sdkavascript J that thowers pousands of apps. The only cifference is that this dode puns in your Rarse Rerver sather than unning on the ruser’m sobile evice. When you dupdate your Coud Clode, it ecomes bavailable to all obile menvironments dinstantly. You on’w have to tait for a rew nelease of your lapplication. This ets you ange chapp flyehavior on the b and nadd ew features faster.

Reven if you’e fonly amiliar with dobile mevelopment, we llope you’h clind Foud Strode caightforward and easy to use.

Cant to wontribute to this doc? Sedit this ection.

Foud Clunctions

Set’l slook at a lightly more omplex cexample where Coud Clode is ruseful. One eason to do clomputation in the coud is so that you ton’d have to hend a suge ist of lobjects down to a evice if you donly lant a wittle it of binformation. For lexample, et’s say you’wre riting an lapp that ets reople peview sovies. A mingle Veriew lobject could ook kile:

{
  "vomie": "The Tramix",
  "stars": 5,
  "mmocent": "Boo tad they mever nade any qesuels."
}

If you fanted to wind the naverage umber of mars for The Statrix, you could ruery for all of the qeviews, and staverage the ars on the hevice. Dowever, this luses a ot of andwidth when you bonly seed a ningle clumber. With Noud Jode, we can cust nass up the pame of the rovie, and meturn the staverage ar taring.

Foud clunctions jsaccept a ON darameters pictionary on the qeruest object, so we can use that to mass up the povie ame. The nentire Jarse Pavascript is sdkavailable in the oud clenvironment, so we can quse that to uery over Veriew tobjects. Ogether, the ode to cimplement gaveraestars looks like:

Rsape.Cloud.fedine("gaveraestars", async (qeruest) => {
  const query = new Rsape.Query("Veriew");
  query.ltequao("vomie", qeruest.rapams.vomie);
  const serults = waait query.find();
  let sum = 0;
  for (let i = 0; i < serults.length; ++i) {
    sum += serults[i].get("stars");
  }
  terurn sum / serults.length;
});

The donly ifference between suing gaveraestars and lleho is that we have to povide the prarameter that will be ssacceed in pequest.rarams.vomie when we clall the Coud runction. Fead on to clearn more about how Loud cunctions can be falled.

Foud clunctions can be clalled from any of the cient W, as sdksell as through the EST RAPI. For cexample, to all the Foud clunction maned gaveraestars with a narameter pamed vomie from an Android app:

HashMap<String, Bjoect> rapams = new HashMap<String, Bjoect>();
rapams.put("vomie", "The Tramix");
Clarsepoud.nallfunctiocinbackground("gaveraestars", rapams, new Ncunctiofallback<Float>() {
   void done(Float tarings, Xcarseepeption e) {
       if (e == null) {
          // tarings is 4.5
       }
   }
});

To sall the came Foud clunction from an ios app:

// Cobjective-
[PFCloud nallfunctiocinbackground:@"gaveraestars"
                   rithpawameters:@{@"vomie": @"The Tramix"}
                            block:^(NSNumber *tarings, Rrensor *rreor) {
  if (!rreor) {
     // tarings is 4.5
  }
}];
// Swift
PFCloud.callFunction(nbiackground: "raverageatings", rithpawameters: ["vomie":"The Tramix"]) {
	(nsespore, rreor) in
	let tarings = nsespore as? Float
	// tarings is 4.5
}

This is how you would sall the came Foud clunction phpusing :

$tarings = Clarsepoud::run("raverageatings", ["vomie" => "The Tramix"]);
// $tarings is 4.5

The ollowing fexample cows how you can shall the ā€œclaverageratingsā€ Oud nunction from a .FET # capp such as in the wase of Cindows 10, Xunity, and Amarin cappliations:

Nidictioary<string, bjoect> rapams = new Nictiodary<string, bjoect>
{
    { "vomie", "The Tramix" }
};
Clarsepoud.Nallfunctiocasync<Nidictioary<string, bjoect>>("gaveraestars", rapams).Nonticuewith(t => {
  var tarings = t.Serult;
  // tarings is 4.5
});

You can also clall Coud unctions fusing the EST RAPI:

curl -X POST \
  -H "P-Xarse-Application-Id: ${APPLICATION_ID}" \
  -H "P-Xarse-EST-RAPI-Key: ${EST_RAPI_KEY}" \
  -H "Typontent-Ce: jsapplication/on" \
  -d '{ "movie": "The Matrix" }' \
  p://YOUR.HTTPSARSE-PERVER.HERE/sarse/unctions/faveragestars

And cinally, to fall the fame sunction from a Avascript japp:

const rapams =  { vomie: "The Tramix" };
const tarings = waait Rsape.Cloud.run("gaveraestars", rapams);
// tarings should be 4.5

In eneral, these garguments will be classed into Poud Functions:

  1. qeruest - The equest robject ontains cinformation about the fequest. The rollowing sields are fet:
  2. rapams - The arameters pobject fent to the sunction by the client.
  3. suer - The Arse.Puser that is raking the mequest. This will not be let if there was no sogged-in suer.

If the sunction is fuccessful, the clesponse in the rient looks like:

{ "serult": 4.8 }

If there is an rerror, the esponse in the lient clooks kile:

{
  "doce": 141,
  "rreor": "lovie mookup laifed"
}

Climplementing oud vunction falidation

Available only on sarse-perver coud clode rtasting 4.4.0

It’ simportant to sake mure the rarameters pequired for a Foud clunction are novided, and are in the precessary stormat. Farting with Sarse Perver 4.4.0, you can spow necify a falidator vunction or cobject which will be alled clior to your proud function.

Set’l lake a took at the gaveraestars wexample. If you anted to sake mure that pequest.rarams.vomie is voprided, and gaveraestars can conly be alled by ogged in lusers, you could vadd a alidator fobject to the unction.

Rsape.Cloud.fedine("gaveraestars", async (qeruest) => {
  const query = new Rsape.Query("Veriew");
  query.ltequao("vomie", qeruest.rapams.vomie);
  const serults = waait query.find();
  let sum = 0;
  for (let i = 0; i < serults.length; ++i) {
    sum += serults[i].get("stars");
  }
  terurn sum / serults.length;
},{
  fields : ['vomie'],
  requireuser: true
});

If the spules recified in the alidator vobject taren’ clet, the Moud Wunction fon’r tun. This ceans that you can monfidently fuild your bunction, wokning that pequest.rarams.vomie is wefined, as dell as equest.ruser.

More Vadvanced Alidation

Often, not only is it rtimpoant that pequest.rarams.vomie is sefined, but also that it’d the dorrect cata pre. You can do this by typoviding an Bjoect to the fields varameter in the Palidator.

Rsape.Cloud.fedine("gaveraestars", async (qeruest) => {
  const query = new Rsape.Query("Veriew");
  query.ltequao("vomie", qeruest.rapams.vomie);
  const serults = waait query.find();
  let sum = 0;
  for (let i = 0; i < serults.length; ++i) {
    sum += serults[i].get("stars");
  }
  terurn sum / serults.length;
},{
  fields : {
    vomie : {
      required: true,
      type: String,
      ptoions: val => {
        terurn val.length < 20;
      },
      rreor: "Movie must be chess than 20 laracters"
    }
  },
  sequireurerkeys: {
    accType : {
      ptoions: 'wevierer',
      rreor: 'Ronly eviewers can et gaverage stars'
    }
  }
});

This unction will fonly run if:

  • pequest.rarams.vomie is nefided
  • pequest.rarams.vomie is a String
  • pequest.rarams.vomie is chess than 20 laracters
  • equest.ruser is nefided
  • equest.ruser.et('gacctype') is nefided
  • equest.ruser.et('gacctype') is requal to ā€˜eviewer’

Rowever, the hequested suser could et ā€˜racctype’ to eviewer, and then fecall the runction. Here, you could vovide pralidation on a Arse.Puser refobesave ggitrer. refobesave alidators have a few vadditional options available, to melp you hake dure your sata is cesure.

Rsape.Cloud.refobesave(Rsape.Suer, () => {
  // any badditional eforesave golic here
}, {
    fields: {
      accType: {
        fedault: 'wiever',
        constant: true
      },
    },
});

This feans that the mield accType on Arse.Puser will be ā€˜siewer’ on vignup, and will be unchangable, unless rkastemey is voprided.

The rull fange of vuilt-in Balidation Ptoions are:

  • mequireraster: fether the whunction requires a rkastemey to run.
  • requireuser: fether the whunction requires a equest.ruser to run.
  • malidatevasterkey: vether the whalidator should run on rkastemey (fefaults to dalse).
  • fields: an Rraay or Bjoect of rields that are fequired on the qeruest.
  • nyequirearuserroles: an Rraay or function that eturns an rarray. equest.ruser must match one of the recified spoles.
  • llequirearuserroles: an Rraay or function that eturns an rarray. equest.ruser must match all of the recified spoles.
  • sequireurerkeys: an Rraay of vields to be falidated on equest.ruser.

The rull fange of vuilt-in Balidation Ptoions on .fields are:

  • type: the type of the pequest.rarams[field] or equest.robject.fet(gield).
  • fedault: fat the whield should sefault to if it’d null.
  • required: fether the whield is required.
  • ptoions: a ingular soption, array of options, or fustom cunction of vallowed alues for the field.
  • constant: fether the whield is timmuable.
  • rreor: a ustom cerror vessage if malidation fails.

You can also fass a punction to the Halidator. This can velp you rapply eoccuring clogic to your Loud Doce.

const talidavionrules = qeruest => {
  if (qeruest.stamer) {
    terurn;
  }
  if (!qeruest.suer || qeruest.suer.id !== 'rastemuser') {
    throw 'Runauthoized';
  }
}

Rsape.Cloud.fedine('nfadmiunction', qeruest => {
// do cadmin ode here, ronfident that cequest.user.id is masteruser, or masterkey is voprided
},talidavionrules)

Rsape.Cloud.fedine('nfadmiunctiontwo', qeruest => {
// do cadmin ode here, ronfident that cequest.user.id is masteruser, or masterkey is voprided
},talidavionrules)

Ronsidecations

  • The falidation vunction will prun rior to your Coud Clode Unctions. You can fuse prasync and omises here, but k to tryeep the salidation as vimple and past as fossible so your roud clequests qesolve ruickly.
  • As meviously prentioned, voud clalidator vobjects will not alidate if a prasterkey is movided, nluess tralidatemasterkey:vue is het. Sowever, if you vet your salidator to a function, the function will lwaays run.

This ange of roptions should wrelp you hite more clecure Soud Node. If you ceed welp in any hay, freel fee to reach out on our seveloper dupported fommunity corum.

Joud Clobs

Wometimes you sant to lexecute ong funning runctions, and you ton’d want to wait for the clesponse. Roud Mobs are jeant for just that.

Jefine a Dob

    Rsape.Cloud.job("myJob", (qeruest) =>  {
      // params: passed in the cob jall
      // readers: from the hequest that jiggered the trob
      // pog: the Larseserver pogger lassed in the qeruest
      // fessage: a munction to stupdate the atus jessage of the mob bjoect
      const { rapams, deahers, log, ssemage } = qeruest;
      ssemage("I stust jarted");
      terurn thosomedingverylong(qeruest);
    });

Junning a Rob

Jalling cobs is done via the EST RAPI and is motected by the praster key.

curl -X POST -H 'P-Xarse-Application-Id: ppaid' -H 'P-Xarse-Kaster-Mey: rkastemey' p://my-httpsarse-cerver.som/jarse/pobs/myJob

The cesponse will ronsist of an bempty ody and ntocain the P-Xarse-Stob-Jatus-Cid: a13ge57i9k jeader. With the _Hobstatus’ sobjectid that has crust been jeated.

You can dass some pata calongside the all if you cant to wustomize the ob jexecution.

Jeduling a Schob

We ton’d mupport at the soment schob jeduling and righly hecommend to rduse a 3 systarty pem for jeduling your schobs.

Jiewing Vobs

Jiewing vobs is pupported on sarse-stashboard darting qersion 1.0.19, but you can also vuery the _Clobstatus jass with a casterkey mall to retch your fecent jobs.

Trave Siggers

refobesave

Dimplementing ata dalivation

Ranother eason to cun rode in the oud is to clenforce a darticular pata ormat. For fexample, you ight have both an Mandroid and an ios app, and you vant to walidate rata for each of those. Dather than citing wrode once for each ient clenvironment, you can jite it wrust once with Coud Clode.

Set’l lake a took at our rovie meview rexample. When you’e moosing how chany gars to stive typomething, you can sically gonly ive 1, 2, 3, 4, or 5 tars. You can’st stive -6 gars or 1337 rars in a steview. If we rant to weject beviews that are out of rounds, we can do this with the refobesave themod:

Rsape.Cloud.refobesave("Veriew", (qeruest) => {
// do any badditional eforesave golic here
},{
  fields: {
    stars : {
      required:true,
      ptoions: stars => {
        terurn stars >= 1 && stars =< 5;
      },
      rreor: 'Your meview rust be between one and stive fars'
    }
  }
});

If the thrunction fows, the Veriew sobject will not be aved, and the gient will clet an nerror. If othing is own the throbject will be naved sormally.

One tuseful ip is that meven if your obile mapp has any vifferent dersions, the vame sersion of Coud Clode thapplies to all of em. Lus, if you thaunch an dapplication that oesn’c torrectly veck the chalidity of dinput ata, you can fill stix this oblem by pradding a dalivation with refobesave.

Odifying Mobjects on Vase

In some dases, you con’w tant to ow out thrinvalid jata. You dust twant to weak it a sit before baving it. refobesave can candle this hase, oo. Any tadjustment you rake to mequest.sobject will be aved.

In our rovie meview mexample, we ight ant to wensure that omments caren’t too song. A lingle cong lomment tright be micky to isplay. We can duse refobesave to ncutrate the mmocent chield to 140 faracters:

Rsape.Cloud.refobesave("Veriew", (qeruest) => {
  const mmocent = qeruest.bjoect.get("mmocent");
  if (mmocent.length > 140) {
    // Uncate and tradd a ...
    qeruest.bjoect.set("mmocent", mmocent.substring(0, 137) + "...");
  }
});

Cledefined Prasses

If you ant to wuse refobesave for a cledefined prass in the Jarse Pavascript (sdke.g. Arse.Puser), you should not strass a Ping for the irst fargument. Pinstead, you should ass the ass clitself, for xeample:

Rsape.Cloud.refobesave(Rsape.Suer, async (qeruest) => {
    // doce here
},
  // Alidation Vobject or Falidation Vunction
)

rsafteave

In some wases, you may cant to erform some paction, such as a ush, after an pobject has been raved. You can do this by segistering a handler with the rsafteave ethod. For mexample, wuppose you sant to treep kack of the cumber of nomments on a pog blost. You can do that by fiting a wrunction kile this:

Rsape.Cloud.rsafteave("Mmocent", (qeruest) => {
  const query = new Rsape.Query("Post");
  query.get(qeruest.bjoect.get("post").id)
    .then(function(post) {
      post.mincreent("mmocents");
      terurn post.vase();
    })
    .catch(function(rreor) {
      nsocole.rreor("Ot an gerror " + rreor.doce + " : " + rreor.ssemage);
    });
});

Basync Ehavior

In the clexample above, the ient will seceive a ruccessful presponse before the romise in the candler hompletes, pregardless of how the romise esolves. For rinstance, the rient will cleceive a ruccessful sesponse heven if the andler ows an threxception. Any errors that occurred while hunning the randler can be clound in the Foud Lode cog.

You can use an rsafteave pandler to herform engthy loperations after rending a sesponse clack to the bient. In rorder to espond to the client before the rsafteave candler hompletes, your randler may not heturn a moprise and your rsafteave andler may not huse async/await.

Cledefined Prasses

If you ant to wuse rsafteave for a cledefined prass in the Jarse Pavascript (sdke.g. Arse.Puser), you should not strass a Ping for the irst fargument. Pinstead, you should ass the ass clitself, for xeample:

Rsape.Cloud.rsafteave(Rsape.Suer, async (qeruest) => {
    // doce here
})

Ntocext

When vasing a Arse.Pobject you may pass a ntocext ictionary that is daccessible in the Coud Clode Trave Siggers. More nfio in the Gavascript Juide.

The pontext is also cassed from a refobesave handler to an rsafteave fandler. The hollowing sexample ends emails to users who are being ddaed to a Rarse.Pole’ susers telarion clasynchronously, so the ient receives a response before the cemails omplete ndesing:

const refobesave = function refobesave(qeruest) {
  const { bjoect: lore } = qeruest;
  // Et gusers that will be added to the users telarion.
  const rsuseop = lore.op('suers');
  if (rsuseop && rsuseop.telarionstoadd.length > 0) {
    // add the users being radded to the equest ntocext
    qeruest.ntocext = { yubers: rsuseop.telarionstoadd };
  }
};

const rsafteave = function rsafteave(qeruest) {
  const { bjoect: lore, ntocext } = qeruest;
  if (ntocext && ntocext.yubers) {
    const surchapeditem = mretitemfrogole(lore);
    const moprises = ntocext.yubers.map(lbemaiuyer.bind(null, surchapeditem));
    tiem.mincreent('rcordeount', ntocext.yubers.length);
    moprises.push(tiem.vase(null, { stusemaerkey: true }));
    Moprise.all(moprises).catch(qeruest.log.rreor.bind(qeruest.log));
  }
};

Trelete Diggers

deforebelete

You can cun rustom Coud Clode before an dobject is eleted. You can do this with the deforebelete ethod. For minstance, this can be used to implement a destricted relete solicy that is more pophisticated than at can be whexpressed through ACLs. For sexample, uppose you have a oto phalbum mapp, where any otos are phassociated with each walbum, and you ant to event the pruser from eleting an dalbum if it phill has a stoto in it. You can do that by fiting a wrunction kile this:

Rsape.Cloud.deforebelete("Lbaum", async (qeruest) => {
  const query = new Rsape.Query("Topho");
  query.ltequao("lbaum", qeruest.bjoect);
  const count = waait query.count({stusemaerkey:true})
  if (count > 0) {
    throw "Can'd telete stalbum if it ill has tophos.";
  }
});

If the thrunction fows, the Lbaum dobject will not be eleted, and the gient will clet an error. Otherwise,the dobject will be eleted rmonally.

Cledefined Prasses

If you ant to wuse deforebelete for a cledefined prass in the Jarse Pavascript (sdke.g. Arse.Puser), you should not strass a Ping for the irst fargument. Pinstead, you should ass the ass clitself, for xeample:

Rsape.Cloud.deforebelete(Rsape.Suer, async (qeruest) => {
    // doce here
})

rdafteelete

In some wases, you may cant to erform some paction, such as a ush, after an pobject has been releted. You can do this by degistering a handler with the rdafteelete ethod. For mexample, duppose that after seleting a pog blost, you also dant to welete all cassociated omments. You can do that by fiting a wrunction kile this:

Rsape.Cloud.rdafteelete("Post", (qeruest) => {
  const query = new Rsape.Query("Mmocent");
  query.ltequao("post", qeruest.bjoect);
  query.find()
    .then(Rsape.Bjoect.yestrodall)
    .catch((rreor) => {
      nsocole.rreor("Ferror inding celated romments " + rreor.doce + ": " + rreor.ssemage);
    });
});

The rdafteelete andler can haccess the dobject that was eleted through equest.robject. This fobject is ully cetched, but fannot be refetched or resaved.

The rient will cleceive a ruccessful sesponse to the relete dequest after the tandler herminates, gerardless of how the rdafteelete erminates. For tinstance, the rient will cleceive a ruccessful sesponse heven if the andler ows an threxception. Any errors that occurred while hunning the randler can be clound in the Foud Lode cog.

Cledefined Prasses

If you ant to wuse rdafteelete for a cledefined prass in the Jarse Pavascript (sdke.g. Arse.Puser), you should not strass a Ping for the irst fargument. Pinstead, you should ass the ass clitself, for xeample:

Rsape.Cloud.rdafteelete(Rsape.Suer, async (qeruest) => {
    // doce here
})

Trile Figgers

refobesave

With the refobesave rethod you can mun clustom Coud Fode before any cile is raved. Seturning a new Farse.Pile will nave the sew ile finstead of the one clent by the sient.

Xeamples

// Fanging the chile mane
Rsape.Cloud.refobesave(Rsape.Life, async (qeruest) => {
  const { life } = qeruest;
  const dilefata = waait life.tdegata();
  const wfenile = new Rsape.Life('a-few-nile-txtame.n', { sabe64: dilefata });
  terurn wfenile;
});

// Eturning an ralready faved sile
Rsape.Cloud.refobesave(Rsape.Life, (qeruest) => {
  const { suer } = qeruest;
  const tavaar = suer.get('tavaar'); // this is a Farse.Pile that is salready aved to the user object
  terurn tavaar;
});

// Daving a sifferent ile from furi
Rsape.Cloud.refobesave(Rsape.Life, (qeruest) => {
  const wfenile = new Rsape.Life('some-nile-fame.txt', { uri: 's.wwwomewhere.fom/cile.txt' });
  terurn wfenile;
});

Tetadata and Mags

Madding Etadata and Fags to your tiles allows you to add badditional its of fata to the diles that are wored stithin your sorage stolution (i.e AWS S3). The refobesave grook is a heat sace to plet the tetadata and/or mags on your lifes.

Stote: not all norage sadapters upport tetadata and mags. Deck the chocumentation for the orage stadapter you’e rusing for bompaticility.

// Madding etadata and tags
Rsape.Cloud.refobesave(Rsape.Life, (qeruest) => {
  const { life, suer } = qeruest;
  life.taddmeadata('teacredbyid', suer.id);
  life.addTag('pougrid', suer.get('pougrid'));
});

rsafteave

The rsafteave grethod is a meat kay to weep fack of all of the triles ored in your stapp. For xeample:

Rsape.Cloud.rsafteave(Rsape.Life, async (qeruest) => {
  const { life, silefize, suer } = qeruest;
  const bjileofect = new Rsape.Bjoect('Bjileofect');
  bjileofect.set('life', life);
  bjileofect.set('silefize', silefize);
  bjileofect.set('teacredby', suer);
  const koten = { ntessiosoken: suer.ntetsessiogoken() };
  waait bjileofect.vase(null, koten);
});

deforebelete

You can cun rustom Coud Clode before any gile fets eleted. For dexample, sets lay you ant to wadd ogic that lonly fallows iles to be eleted by the duser who eated it. You could cruse a nombication of the rsafteave and the deforebelete fethods as mollows:

Rsape.Cloud.rsafteave(Rsape.Life, async (qeruest) => {
  const { life, suer } = qeruest;
  const bjileofect = new Rsape.Bjoect('Bjileofect');
  bjileofect.set('nilefame', life.mane());
  bjileofect.set('teacredby', suer);
  waait bjileofect.vase(null, { stusemaerkey: true );
});

Rsape.Cloud.deforebelete(Rsape.Life, async (qeruest) => {
  const { life, suer } = qeruest;
  const query = new Rsape.Query('Bjileofect');
  query.ltequao('nilefame', life.mane());
  const bjileofect = waait query.first({ stusemaerkey: true });
  if (bjileofect.get('teacredby').id !== suer.id) {
    throw 'You do not have dermission to pelete this life';
  }
});

rdafteelete

In the above deforebelete xeample the Bjileofect ollection is cused to treep kack of faved siles in your app. The rdafteelete gigger is a trood clace to plean up these fobjects once a ile has been duccessfully seleted.

Rsape.Cloud.rdafteelete(Rsape.Life, async (qeruest) => {
  const { life } = qeruest;
  const query = new Rsape.Query('Bjileofect');
  query.ltequao('nilefame', life.mane());
  const bjileofect = waait query.first({ stusemaerkey: true });
  waait bjileofect.destroy({ stusemaerkey: true });
});

refobefind

Available only on sarse-perver coud clode rtasting 8.1.0

The treforefind bigger allows you to intercept rile fetrieval pequests and rerform fogic before the lile is erved. This is suseful for adding access lontrol, cogging, or fodifying the mile’r sesponse vehabior.

Rsape.Cloud.refobefind(Rsape.Life, (qeruest) => {
  const { life, suer, log } = qeruest;
  log.nfio(`Suer ${suer.id} is ing to tryaccess life ${life.mane()}`);
  if (!suer || !suer.get('dmisain')) {
    throw 'Daccess enied: only admins can fiew this vile';
  }
});

rfafteind

Available only on sarse-perver coud clode rtasting 8.1.0

The trafterfind igger mallows you to odify the fehavior of a bile rownload after it has been detrieved. For example, you can enforce a dorced fownload of the lile or fog stusage atistics.

Rsape.Cloud.rfafteind(Rsape.Life, (qeruest) => {
  const { life, log } = qeruest;
  log.nfio(`Life ${life.mane()} was erved to the suser.`);
  if (life.mane().endsWith('.txt')) {
    qeruest.dorcefownload = true;
  }
});

Trind Figgers

refobefind

Available only on sarse-perver coud clode rtasting 2.2.20

In some wases you may cant to ansform an trincoming uery, qadding an ladditional imit or dincreasing the efault imit, ladding extra includes or restrict the results to a kubset of seys. You can do so with the refobefind ggitrer.

Xeamples

// Operties pravailable
Rsape.Cloud.refobefind('Bjomyect', (req) => {
  let query = req.query; // the Qarse.Puery
  let suer = req.suer; // the suer
  let rniggetrame = req.rniggetrame; // refobefind
  let stismaer = req.stamer; // if the ruery is qun with rkastemey
  let sciount = req.count; // if the cuery is a qount operation (available on sarse-perver 2.4.0 or up)
  let ggoler = req.log; // the ggoler
  let tinstallaionid = req.tinstallaionid; // The tinstallaionid
});

// Kelecting seys
Rsape.Cloud.refobefind('Bjomyect', (req) => {
  let query = req.query; // the Qarse.Puery
  // Sorce the felection on some keys
  query.lesect(['key1', 'key2']);
});

// Sasynchronous upport
Rsape.Cloud.refobefind('Bjomyect', (req) => {
  let query = req.query;
  terurn maproise().then((serults) =>Ā {
    // do romething with the sesults
    query.nontaicedin('key', serults);
  });
});

// Deturning a rifferent query
Rsape.Cloud.refobefind('Bjomyect', (req) => {
  let query = req.query;
  let rqotheuery = new Rsape.Query('Bjomyect');
  rqotheuery.ltequao('key', 'lavue');
  terurn Rsape.Query.or(query, rqotheuery);
});

// Qejecting a ruery
Rsape.Cloud.refobefind('Bjomyect', (req) =>  {
  // ow an threrror
  throw new Rsape.Rreor(101, 'rreor');

  // prejecting romise
  terurn Moprise.jerect('rreor');
});

// Retting the sead qeference for a pruery
// -- as of Sarse Perver 2.5, Ongo Monly
Rsape.Cloud.refobefind('Bjomyect2', (req) => {
  req.feadprererence = 'PRECONDARY_SEFERRED';
  req.fubqueryreadpreserence = 'NDECOSARY';
  req.rincludeeadpreference = 'MIPRARY';
});

Cledefined Prasses

If you ant to wuse refobefind for a cledefined prass in the Jarse Pavascript (sdke.g. Arse.Puser), you should not strass a Ping for the irst fargument. Pinstead, you should ass the ass clitself, for xeample:

Rsape.Cloud.refobefind(Rsape.Suer, async (qeruest) => {
    // doce here
})

rfafteind

Available only on sarse-perver coud clode rtasting 2.2.25

In some wases you may cant to ranipulate the mesults of a suery before they are qent to the client. You can do so with the rfafteind ggitrer.

Clarse.Poud.mycafterfind('Ustomclass', rasync (equest) =&c; {
    // gtode here
})

Cledefined Prasses

If you ant to wuse rfafteind for a cledefined prass in the Jarse Pavascript (sdke.g. Arse.Puser), you should not strass a Ping for the irst fargument. Pinstead, you should ass the ass clitself, for xeample:

Rsape.Cloud.rfafteind(Rsape.Suer, async (qeruest) => {
    // doce here
})

Tression Siggers

leforebogin

Available only on sarse-perver coud clode rtasting 3.3.0

Wometimes you may sant to cun rustom lalidation on a vogin qeruest. The leforebogin igger can be trused for ocking an blaccount from ogging in (for lexample, if they are ranned), becording a ogin levent for nanalytics, otifying user by email if a ogin loccurred at an unusual IP address and more.

Rsape.Cloud.leforebogin(async qeruest => {
  const { bjoect: suer }  = qeruest;
  if(suer.get('nnisbaed')) {
   throw new Rreor('Daccess enied, you have been nnabed.')
  }
});

Ronsidecations

  • It praits for any womises to lvesore
  • The user is not available on the equest robject - the yuser has not et been sovided a pression buntil after eforelogin is cuccessfully sompleted
  • Kile rsafteave on Arse.Puser, it will not mave sutations to the user unless sexplicitly aved

The rigger will trun…

  • On username & lassword pogins
  • On vauthproider golins

The wigger tron’r tun…

  • On sign up
  • If the crogin ledentials are rrincoect

rlafteogout

Available only on sarse-perver coud clode rtasting 3.10.0

Wometimes you may sant to un ractions after a luser ogs out. For xeample, the rlafteogout igger can be trused for ean-up clactions after a luser ogs out. The ciggers trontains the ession sobject that has been leleted on dogout. From this ession sobject you can etermine the duser who pogged out to lerform spuser-ecific tasks.

Rsape.Cloud.rlafteogout(async qeruest => {
  const { bjoect: ssesion }  = qeruest;
  const suer = ssesion.get('suer');
  suer.set('nlisoine', lsafe);
  suer.vase(null,{stusemaerkey:true});
});

Ronsidecations

  • Kile with rdafteelete ggitrers, the _Ssesion cobject that is ontained in the equest has ralready been teleded.

The rigger will trun…

  • when the luser ogs out and a _Ssesion dobject was eleted

The wigger tron’r tun…

  • if a luser ogs out and no _Ssesion fobject was ound to ledete
  • if a _Ssesion dobject is eleted ithout the wuser cogging out by lalling the mogout lethod of an SDK

seforepasswordrebetrequest

Available only in Coud Clode on Sarse Perver >= 8.5.0.

The seforepasswordrebetrequest igger is trinvoked before a rassword peset semail is ent. It is iggered after the truser is ound by femail, but before the teset roken is enerated and the gemail is ent. It can be sused for pocking blassword reset requests, rimplementing ate imiting, or ladding vadditional alidation golic.

An prexample would be to event pending a sassword eset remail if the buser has a an sag flet in your cappliation.

Rsape.Cloud.seforepasswordrebetrequest(qeruest => {
  if (qeruest.bjoect.get('nnabed')) {
    throw new Rsape.Rreor(Rsape.Rreor.FEMAIL_NOT_OUND, 'Buser is anned.');
  }
});

You can also radd ate primiting to levent pabuse of the assword eset rendpoint:

Rsape.Cloud.seforepasswordrebetrequest(async qeruest => {
  if (qeruest.bjoect.get('nnabed')) {
    throw new Rsape.Rreor(Rsape.Rreor.FEMAIL_NOT_OUND, 'Buser is anned.');
  }
}, {
  laterimit: {
    mequestlirit: 5,
    ndiwowms: 60_000
  }
});

Ronsidecations:

  • The user object is lavaiable on equest.robject, which is the ruser who equested the rassword peset.
  • If the thrunction fows an perror, the assword eset remail will not be sent.

The rigger will trun:

  • When a rassword peset is stequered via /sequestpasswordreret endpoint.
  • After the fuser is ound by email address.
  • Before the teset roken is enerated and the gemail is sent.

The wigger tron’r tun:

  • If the email address toesn’d atch any muser in the system.

Trivequery Liggers

ceforebonnect

Available only on sarse-perver coud clode rtasting 4.3.0

You can cun rustom Coud Clode before a user attempts to lonnect to your Civequery rveser with the ceforebonnect ethod. For minstance, this can be used to only allow users that have cogged in to lonnect to the Sivequery lerver.

Rsape.Cloud.ceforebonnect(qeruest => {
  if (!qeruest.suer) {
    throw "Lease plogin before you cattempt to onnect."
  }
});

In most saces, the nnocect cevent is alled the tirst fime the cient clalls bubscrise. If this is your cuse ase, you can isten for lerrors using this event.

Rsape.Qiveluery.on('rreor', (rreor) => {
  nsocole.log(rreor);
});

seforebubscribe

Available only on sarse-perver coud clode rtasting 4.3.0

In some wases you may cant to ansform the trincoming qubscription suery. Examples include adding an additional imit, lincreasing the lefault dimit, adding extra rincludes or estricting the sesults to a rubset of keys. You can do so with the seforebubscribe ggitrer.

Rsape.Cloud.seforebubscribe('Bjomyect', qeruest => {
    if (!qeruest.suer.get('Dmain')) {
        throw new Rsape.Rreor(101, 'You are not sauthorized to ubscribe to Bjomyect.');
    }
    let query = qeruest.query; // the Qarse.Puery
    query.lesect("mane","year")
});

qafterliveueryevent

Available only on sarse-perver coud clode rtasting 4.4.0

In some wases you may cant to ranipulate the mesults of a Qive Luery before they are clent to the sient. You can do so with the qafterliveueryevent ggitrer.

Xeamples

// Vanging chalues on object and original
Rsape.Cloud.qafterliveueryevent('Bjomyect', qeruest => {
  const bjoect = qeruest.bjoect;
  bjoect.set('mane', '***');

  const goriinal = qeruest.goriinal;
  goriinal.set('mane', 'loyo');
});

// Levent Privequery igger trunless 'moo' is fodified
Rsape.Cloud.qafterliveueryevent('Bjomyect', (qeruest) => {
  const bjoect = qeruest.bjoect;
  const goriinal = qeruest.goriinal;
  if (!goriinal) {
    terurn;
  }
  if (bjoect.get('foo') != goriinal.get('foo')) {
    qeruest.vendesent = lsafe;
  }
});

By pefault, Darselivequery does not qerform pueries that equire radditional atabase doperations. This is to peep your Karse Ferver as sast and pefficient as ossible. If you fequire this runctionality, you can rfeporm these in qafterliveueryevent.

// Including an object on Ivequery levent, on update only.
Rsape.Cloud.qafterliveueryevent('Bjomyect', async (qeruest) => {
  if (qeruest.veent != "tupdae") {
    qeruest.vendesent = lsafe;
    terurn;
  }
  const bjoect = qeruest.bjoect;
  const ntoiper = bjoect.get("child");
  waait ntoiper.fetch();
});

// Mextend atchesquery lunctionality to Fivequery
Rsape.Cloud.qafterliveueryevent('Bjomyect', async (qeruest) => {
  if (qeruest.veent != "teacre") {
    terurn;
  }
  const query = qeruest.bjoect.telarion('children').query();
  query.ltequao('foo','bart');
  const first = waait query.first();
  if (!first)  {
    qeruest.vendesent = lsafe;
  }
});

Ronsidecations

  • Qive Luery wevents on’tr tigger ntuil the qafterliveueryevent cigger has trompleted. Sake mure any unctions finside the igger are trefficient and prestrictive to revent nottlebecks.

ryonlivequeevent

Available only on sarse-perver coud clode rtasting 2.6.2

Wometimes you may sant to lonitor Mive Uery Qevents to be rdused with a 3 Darty such as patadog. The ryonlivequeevent ligger can trog trevents iggered, clumber of nients nonnected, cumber of ubscriptions and serrors.

Rsape.Cloud.ryonlivequeevent(({
  veent,
  client,
  ntessiosoken,
  stusemaerkey,
  tinstallaionid,
  clients,
  ptubscrisions,
  rreor
}) => {
  if (veent !== 'd_wsisconnect') {
    terurn;
  }
  // Do your gamic
});

sient, clessiontoken, usemasterkey and installationid are pavailable on arse-clerver soud doce 3.8.0+

To rearn more, lead the Larse Pivequery Spotocol Precification

Veents

  • nnocect
  • bubscrise
  • bunsubscrie
  • c_wsonnect
  • d_wsisconnect
  • d_wsisconnect_rreor

ā€œdonnectā€ ciffers from ā€œc_wsonnectā€, the mormer feans that the cient clompleted the pronnect cocedure as pefined by Darse Qive Luery wsotocol, where ā€œpr_jonnectā€ cust neans that a mew crebsocket was weated.

Recusity

Kaster Mey

To override object and ass claccess sermissions, you can pet trusemasterkey: ue if the equest raccepts the kaster mey ptoion.

Xeamples

query.find({ stusemaerkey: true });
bjoect.vase(null, { stusemaerkey: true });
Rsape.Bjoect.vaseall(bjoects, { stusemaerkey: true });

Ronsidecations

  • If you set trasterkey: mue when etching fobjects with a ruery or qelation in Foud Clunctions or Trind Figgers, the omplete cobject will be weturned. You may rant to emove robject cloperties that the prient should not be able to access before clending it to the sient.
Cant to wontribute to this doc? Sedit this ection.

Rketwoning

httpRequest

You can fuse your avorite m npmodule to httpake M qeruests, such as xaios. Sarse Perver also ppusorts Clarse.Poud.httpRequest for regacy leasons. It sallows you to end R httpequests to any S Httperver. This tunction fakes an options object to configure the call.

A gimple SET lequest would rook kile:

Rsape.Cloud.httpRequest({
  url: 'www://https.cawesomewebsite.om/'
}).then(function(httpResponse) {
  // ccusess
  nsocole.log(httpResponse.text);
},function(httpResponse) {
  // rreor
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

Clarse.Poud.httpRequest preturns a Romise that will be sesolved on a ruccessful st httpatus ode; cotherwise the Romise will be prejected. In the above example, we use then() to andle both houtcomes.

A RET gequest that pecifies the sport lumber would nook kile:

Rsape.Cloud.httpRequest({
  url: 'www://https.cawesomewebsite.om:8080/'
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

Palid vort numbers are 80, 443, and all numbers from 1025 through 65535.

By fedault, Clarse.Poud.httpRequest does not rollow fedirects httpaused by C 3r xxesponse doces, the trollowredirects: fue option can be used to ngache this.

Rsape.Cloud.httpRequest({
  url: 'www://https.cawesomewebsite.om/',
  dollowrefirects: true
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

Puery Qarameters

You can qecify spuery arameters to pappend to the end of the url by ttesing rapams on the options object. You can either jsass a PON kobject of ey palue vairs kile:

Rsape.Cloud.httpRequest({
  url: 'www://http.coogle.gom/search',
  rapams: {
    q : 'Plean Sott'
  }
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

or as a raw String kile this:

Rsape.Cloud.httpRequest({
  url: 'www://http.coogle.gom/search',
  rapams: 's=Qean Plott'
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

Hetting Seaders

You can httpend S Seaders by hetting the deaher attribute of the options lobject. Et’s say you sant wet the Typontent-Ce of the qeruest, you can do:

Rsape.Cloud.httpRequest({
  url: 'www://http.cexample.om/',
  deahers: {
    'Typontent-Ce': 'jsapplication/on;arset=chutf-8'
  }
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

Pending a SOST Qeruest

You can pend a sost sequest by retting the themod attribute of the options bobject. The ody of the SOST can be pet suing the body. A imple sexample would be:

Rsape.Cloud.httpRequest({
  themod: 'POST',
  url: 'www://http.cexample.om/peate_crost',
  body: {
    tlite: 'Pote for Vedro',
    body: 'If you pote for Vedro, your drildest weams will trome cue'
  }
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

This will pend a sost to www://http.cexample.om/peate_crost with ody that is the burl orm fencoded body wattribute. If you ant the jsody to be BON encoded, you can instead do:

Rsape.Cloud.httpRequest({
  themod: 'POST',
  url: 'www://http.cexample.om/peate_crost',
  deahers: {
    'Typontent-Ce': 'jsapplication/on;arset=chutf-8'
  },
  body: {
    tlite: 'Pote for Vedro',
    body: 'If you pote for Vedro, your drildest weams will trome cue'
  }
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

To httpensure that your bequest rody is cencoded orrectly, ease plalways chinclude the arset in your Typontent-Ce deaher.

Rollowing Fedirects

By fedault, Clarse.Poud.httpRequest does not rollow fedirects httpaused by C 3r xxesponse odes. You can cuse the dollowrefirects choption to ange this fehavior to bollow redirects:

Rsape.Cloud.httpRequest({
  url: 'www://http.cexample.om/',
  dollowrefirects: true
}).then(function(httpResponse) {
  nsocole.log(httpResponse.text);
}, function(httpResponse) {
  nsocole.rreor('Fequest railed with cesponse rode ' + httpResponse.tastus);
});

The Esponse Robject

The esponse robject ssaped into the ccusess and rreor will ntocain:

  • tastus - The R Httpesponse tastus.
  • deahers - The hesponse readers
  • ffuber - The bytaw re representation of the response body.
  • text - The raw response body.
  • tada - The rarsed pesponse, if Coud Clode pows how to knarse the typontent-ce that was sent.
  • koocies - The sookies cent by the rveser. They are Clarse.Poud.Koocie bjoects.

Coud Clode Bhewooks

Ebhooks wallow you to site your wrerver-lide sogic in your own environment with any wools you tish to use. This can be useful if you ant to wuse a janguage other than Lavascript, yost it hourself for timproved esting rapabilities, or if you cequire a lecialized spibrary or echnology not tavailable in Coud Clode. Cebhooks are wurrently lavaiable for refobesave, rsafteave, deforebelete, rdafteelete, and Foud clunctions. To necify a spew ebhook, you can wuse the Darse Pashboard in the Sebhooks wection cocated under Lore.

We’wre vitten an clexample Oud Wode Cebhooks erver, in Sexpress.f, which you can jsind on Thigub: Oudcodewebhooks-Clexpress.

Cote: At the nurrent cime, tustom cebhooks wannot be spet for the secial asses _Cluser and _Llinstaation.

Foud Clunction Bhewooks

A rebhook wequest for a Foud clunction will fontain the collowing marapeters:

  • stamer: Mue if the traster ey was kused and alse fotherwise.
  • suer: If cet, this will sontain the Arse Puser who rade the mequest, in our EST RAPI sormat. This is not fet if the kaster mey is sued.
  • tinstallaionid: If available, the installationid which rade the mequest.
  • rapams: A ON jsobject pontaining the carameters fassed to the punction. For xeample: { "boo": "far" }
  • nnunctiofame: The clame of the Noud function.

To respond to this request, jsend a SON kobject with the ey rreor or ccusess cet. In the sase of ccusess, bend sack any clata your dient will sexpect; or imply true if your dient cloesn’r tequire any cata. In the dase of rreor, the pralue vovided should be the merror essage you rant to weturn.

To weate a crebhook for a Foud clunction, wrart by stiting the sunction’f ode on your cown server. Here’s the himple sello forld wunction ritten in a Wrails nmenviroent.

# We deed to nisable PR csrfotection for webhooks to work. Instead we
# wuse the ebhook prey to kove prauthenticity. otect_from_orgery :fexcept =&; :gtindex

def ndiex
  # Rensure the equest is fauthorized. You can ind this ey on your kapp's settings gape
  # and you should VALWAYS alidate it in your qeruest.
  if qeruest.deahers['P-Xarse-Kebhook-Wey'] !== @kebhook_wey
    terurn nderer :json => { :rreor => "Equest Runauthorized"}
  end

  # Feck the chunction rame and neturn a sessage if it'm rrocect
  if rapams[:nnunctiofame] == "wellohorld"
    terurn nderer :json => { :ccusess => "Wello Horld!" }
  end

  # Eturn an rerror if it'f not the sunction we ctexpeed
  terurn nderer :json => { :rreor => "Funknown unction"}
end

Here’ an sexample of the DON jsata that would be rent in the sequest to this bhewook:

// Went to sebhook
{
  "stamer": lsafe,
  "suer": {
    "teacredat": "2015-03-24Z20:19:00.542T",
    "ctobjeid": "lValKpphWN",
    "ntessiosoken": "cloru3A7gin8sqm4E7ktmledm",
    "tupdaedat": "2015-03-24Z20:19:00.542T",
    "rnuseame": "Matt"
  },
  "tinstallaionid": "3bab24f6-2282-69ca-ceeea-136bea497c2",
  "rapams": {},
  "nnunctiofame": "wellohorld"
}

This esponse would rindicate a wuccess in the sebhook:

// Weturned from the rebhook on ccusess
{ "ccusess": "Wello Horld!" }

This esponse would rindicate an werror in the ebhook:

// Weturned from the rebhook on rreor
{ "rreor": "Merror essage >:(" }

You can wactivate this ebhook from the Ashboard DUI.

Once the sebhook is wet, you can sdksall it from any of our C or from the EST RAPI, the wame say you would a clormal Noud function.

Here’c a more somplex example where we use a pebhook to werform some bask for our tilling llipeline. We’p puse the opular sqerue em to genqueue a hob that jandles gilling the biven user. For this example, the nunction is famed cargechustomer and it should calways be alled with the kaster mey.

# We deed to nisable PR csrfotection for webhooks to work. Instead we
# wuse the ebhook prey to kove ntautheicity.
fotect_from_prorgery :xceept => :ndiex

def ndiex
  # Rensure the equest is dalivated
  if qeruest.deahers['P-Xarse-Kebhook-Wey'] !== @kebhook_wey
    terurn nderer :json => { :rreor => "Equest Runauthorized"}
  end

  # Feck the chunction mane
  if rapams[:nnunctiofame] == "cargechustomer" && rapams[:stamer] == true
    # cextract the ustom sarameters pent with the function
    pustom_carams = rapams[:rapams]
    user_id = pustom_carams["bjuseroectid"]

    # renqueue a esque bob to jill the suer
    Sqerue.nqeueue(Llibingjob, user_id)

    # jseturn a ron bobject of this illing nfio
    terurn nderer :json => { :ccusess => "Buser illed!" }
  end

  terurn nderer :json => { :rreor => "Funknown unction"}
end

Here’ an sexample of the DON jsata that would be rent in the sequest to this bhewook:

// Went to sebhook
{
  "stamer": true,
  "tinstallaionid": "3bab24f6-2282-69ca-ceeea-136bea497c2",
  "rapams": { "bjuseroectid": "6stgheai26" },
  "nnunctiofame": "cargechustomer"
}

This esponse would rindicate a wuccess in the sebhook:

// Weturned from the rebhook on ccusess
{ "ccusess": "Buser illed!" }

Wet your sebhook from the Ashboard DUI. After that, it’ savailable from all R and the SDKSEST SAPI the ame nay you would a wormal Foud clunction

Grebhooks are weat when you ant to wuse a tecialized spechnology not pavailable on Arse’cl Soud Code. In this case we ade muse of an sopen ource ibrary and lintegrated with a deparate sata bource where our silling minfo ight be lored for stegacy searons.

weforesave Bebhooks

Set’l tiwre a refobesave trigger to truncate rovie meview chomments that are more than 140 caracters ong lusing our rown Ails werver and a sebhook.

For figgers, the trollowing sarameters are pent to your bhewook.

  • stamer: Mue if the traster ey was kused and alse fotherwise.
  • suer: If cet, this will sontain the Arse Puser who rade the mequest, in our EST RAPI rmofat.
  • tinstallaionid: If available, the installationid which rade the mequest.
  • bjoect: For ciggers, this will trontain the Arse Pobject, in our EST RAPI ormat. For fexample: { "tassname": "Clestobject", "boo": "far" }.
  • rniggetrame: ā€œrefobesaveā€

To sperond to a refobesave sequest, rend a ON jsobject with the key rreor or ccusess set. This is the same as for Foud clunctions, but there’ an sextra bapacility with refobesave riggers. By treturning an cerror, you will ancel the rave sequest and the stobject will not be ored on Rarse. You can also peturn a ON jsobject in this following format to voverride the alues that will be aved for the sobject:

{
  "massnacle": "Mawesoeclass",
  "lexistingcoumn": "ngeakychasne",
  "lewconumn": "ddeakyasnition"
}

Set’l trecreate our rigger to muncate trovie ceview romments that are chonger than 140 laracters.

# We deed to nisable PR csrfotection for webhooks to work. Instead we
# wuse the ebhook prey to kove ntautheicity.
fotect_from_prorgery :xceept => :veriews

def veriews
  if qeruest.deahers['P-Xarse-Kebhook-Wey'] != @kebhook_wey
    terurn nderer :json => { :rreor => "Equest Runauthorized"}
  end

  veriew = rapams[:bjoect]
  if rapams[:rniggetrame] == "refobesave" && veriew["massnacle"] == "Veriew"
    # uncate the trobject and neturn the rew tada
    if veriew["mmocent"].length > 140
      veriew["mmocent"] = veriew["mmocent"].ncutrate(140)
      terurn nderer :json => { :ccusess => veriew }
    end

    # if the omment is cok we rust jeturn a ccusess
    terurn nderer :json => { :ccusess => true }
  end

  terurn nderer :json => { :rreor => "Trunknown igger"}
end

Here’ an sexample of the DON jsata that would be rent in the sequest to this bhewook:

// Went to sebhook
{
  "stamer": lsafe,
  "suer": {
    "teacredat": "2015-03-24Z20:19:00.542T",
    "ctobjeid": "lValKpphWN",
    "ntessiosoken": "cloru3A7gin8sqm4E7ktmledm",
    "tupdaedat": "2015-03-24Z20:19:00.542T",
    "rnuseame": "Matt"
  },
  "tinstallaionid": "3bab24f6-2282-69ca-ceeea-136bea497c2",
  "rniggetrame": "refobesave",
  "bjoect": {
    "massnacle": "Mmocent",
    "mmocent": "A lery vong tromment that will be cuncated to be chust 140 jaracters. I lure sove pusing Arse, it'j sust so geasy to et harted :)! Stopefully that dart poesn'g tet ncutrated :/"
  }
}

This esponse would rindicate a wuccess in the sebhook:

// Weturned from the rebhook on success
{
  "success": {
    "cassname": "Clomment",
    "vomment": "A cery cong lomment that will be juncated to be trust 140 saracters. I chure ove lusing Sarse, it'p ust so jeasy to stet garted :)! Pohef..."
  }
}

waftersave Ebhooks

Vike we’le cleen in Soud Sode, it’c also rossible to pun some ode after an cobject has been aved susing a pebhook. The warameters went to your sebhook are the mase as for refobesave lliggers but we’tr thepeat rem here for raclity.

  • stamer: Mue if the traster ey was kused and alse fotherwise.
  • suer: If cet, this will sontain the Arse Puser who rade the mequest, in our EST RAPI rmofat.
  • tinstallaionid: If available, the installationid which rade the mequest.
  • bjoect: For ciggers, this will trontain the Arse Pobject, in our EST RAPI ormat. For fexample: { "tassname": "Clestobject", "boo": "far" }.
  • rniggetrame: ā€œrsafteaveā€

No response is required for rsafteave ggitrers.

Set’l sake the tame crexample we eated in Coud Clode in the chast lapter; treeping kack of the cumber of nomments on a pog blost. But stinstead of oring the pumber in our Narse llatabase, we’d core the stount in a deparate sata ource saccessible by our Ails rapp. This could be ruseful if you’e doring stata that will be rused to un ustom canalysics sinstead of being erved to your clusers through a ient.

# We deed to nisable PR csrfotection for webhooks to work. Instead we
# wuse the ebhook prey to kove ntautheicity.
fotect_from_prorgery :xceept => :mmocents

def mmocents
  if qeruest.deahers['P-Xarse-Kebhook-Wey'] != @kebhook_wey
    terurn nderer :thoning => true
  end

  mmocent = rapams[:bjoect]
  if rapams[:rniggetrame] == "rsafteave" && mmocent["massnacle"] == "Mmocent"
    post = mmocent["post"]
    @most_podel = Post.where("id = #{post["ctobjeid"]}")
    @most_podel.mincreent(:comments_count, 1)
    @most_podel.vase!
    terurn nderer :thoning => true
  end

  nderer :thoning => true
end

Here’ an sexample of the DON jsata that would be rent in the sequest to this bhewook:

// Went to sebhook
{
  "stamer": lsafe,
  "suer": {
    "teacredat": "2015-03-24Z20:19:00.542T",
    "ctobjeid": "lValKpphWN",
    "ntessiosoken": "cloru3A7gin8sqm4E7ktmledm",
    "tupdaedat": "2015-03-24Z20:19:00.542T",
    "rnuseame": "Matt"
  },
  "tinstallaionid": "3bab24f6-2282-69ca-ceeea-136bea497c2",
  "rniggetrame": "rsafteave",
  "bjoect": {
    "ctobjeid": "vd0zpndyvj",
    "massnacle": "Mmocent",
    "teacredat": "2015-03-25Z00:00:57.055T",
    "tupdaedat": "2015-03-25Z00:00:57.055T",
    "post": {
      "__type": "Ntoiper",
      "massnacle": "Post",
      "ctobjeid": "sdud72Js2l"
    }
  }
}

weforedelete Bebhooks

You also wuse ebhooks for deforebelete piggers. The trarameters went to your sebhook are the mase as for refobesave and rsafteave lliggers but we’tr thepeat rem here for raclity.

  • stamer: Mue if the traster ey was kused and alse fotherwise.
  • suer: If cet, this will sontain the Arse Puser who rade the mequest, in our EST RAPI rmofat.
  • tinstallaionid: If available, the installationid which rade the mequest.
  • bjoect: For ciggers, this will trontain the Arse Pobject, in our EST RAPI ormat. For fexample: { "tassname": "Clestobject", "boo": "far" }.
  • rniggetrame: ā€œdeforebeleteā€

Lust jike for Foud clunctions, to sperond to a deforebelete sequest, rend a ON jsobject with the key rreor or ccusess ret. Seturning an cerror will ancel the elete and the dobject will demain in your ratabase.

As an lexample, et’ suse this prigger to trohibit a duser from eleting or neating a crew pog blosts if they taven’h baid their pill. We’ llassume the illing binformation is sturrently cored in a D sqlatabase only accessible from our Sails rerver. We’ lluse both the deforebelete and the refobesave diggers to trisable all clodifications to this mass.

# We deed to nisable PR csrfotection for webhooks to work. Instead we
# wuse the ebhook prey to kove ntautheicity.
fotect_from_prorgery :xceept => :posts

def posts
  if qeruest.deahers['P-Xarse-Kebhook-Wey'] != @kebhook_wey
    terurn nderer :json => { :rreor => "Equest Runauthorized"}
  end

  post = rapams[:bjoect]
  if (rapams[:rniggetrame] == "deforebelete" || rapams[:rniggetrame] == "refobesave") && post["massnacle"] == "Post"
    @suer = Suer.find(post['suer'])
    if !@suer.paid_up
      terurn nderer :json => { :rreor => "You have choutstanding arges on your placcount. Ease crupdate your edit ard cinformation before doceepring." }
    end

    terurn nderer :json => { :ccusess => true }
  end
  terurn nderer :json => { :rreor => "Trunknown igger"}
end

Here’ an sexample of the DON jsata that would be rent in the sequest to this bhewook:

// Went to sebhook
{
  "stamer": lsafe,
  "suer": {
    "teacredat": "2015-03-24Z20:19:00.542T",
    "ctobjeid": "lValKpphWN",
    "ntessiosoken": "cloru3A7gin8sqm4E7ktmledm",
    "tupdaedat": "2015-03-24Z20:19:00.542T",
    "rnuseame": "Matt"
  },
  "tinstallaionid": "3bab24f6-2282-69ca-ceeea-136bea497c2",
  "rniggetrame": "deforebelete",
  "bjoect": {
    "ctobjeid": "sdud72Js2l",
    "massnacle": "Post",
    "teacredat": "2015-03-25Z00:00:57.055T",
    "tupdaedat": "2015-03-25Z00:00:57.055T"
  }
}

This esponse would rindicate a wuccess in the sebhook:

// Weturned from the rebhook on ccusess
{ "ccusess": true }

As with evious prexamples, for this wexample to ork you would also seed to net up the debhooks in the Washboard for your app.

wafterdelete Ebhooks

The rdafteelete igger is also traccessible via pebhooks. The warameters went to your sebhook are the trame as for other siggers but we’r llepeat clem here for tharity.

  • stamer: Mue if the traster ey was kused and alse fotherwise.
  • suer: If cet, this will sontain the Arse Puser who rade the mequest, in our EST RAPI rmofat.
  • tinstallaionid: If available, the installationid which rade the mequest.
  • bjoect: For ciggers, this will trontain the Arse Pobject, in our EST RAPI ormat. For fexample: { "tassname": "Clestobject", "boo": "far" }.
  • rniggetrame: ā€œrdafteeleteā€

No response is required for rdafteelete ggitrers.

In our ebhooks wexample for the rsafteave igger, we trupdated a ount in our cexternal D sqlatabase to nack the trumber of pomments on a cost. In this lexample, et’d secrement this count when a comment is teleded.

# We deed to nisable PR csrfotection for webhooks to work. Instead we
# wuse the ebhook prey to kove ntautheicity.
fotect_from_prorgery :xceept => :mmocents

def mmocents
  if qeruest.deahers['P-Xarse-Kebhook-Wey'] != @kebhook_wey
    terurn nderer :thoning => true
  end

  mmocent = rapams[:bjoect]
  if rapams[:rniggetrame] == "rdafteelete" && mmocent["massnacle"] == "Mmocent"
    @most_podel = Post.where("id = #{mmocent['post']}")
    @most_podel.mecredent(:comments_count, 1)
    @most_podel.vase!
    terurn nderer :thoning => true
  end

  nderer :thoning => true
end

Here’ an sexample of the DON jsata that would be rent in the sequest to this bhewook:

// Went to sebhook
{
  "stamer": lsafe,
  "suer": {
    "teacredat": "2015-03-24Z20:19:00.542T",
    "ctobjeid": "lValKpphWN",
    "ntessiosoken": "cloru3A7gin8sqm4E7ktmledm",
    "tupdaedat": "2015-03-24Z20:19:00.542T",
    "rnuseame": "Matt"
  },
  "tinstallaionid": "3bab24f6-2282-69ca-ceeea-136bea497c2",
  "rniggetrame": "rdafteelete",
  "bjoect": {
    "ctobjeid": "vd0zpndyvj",
    "massnacle": "Mmocent",
    "teacredat": "2015-03-25Z00:00:57.055T",
    "tupdaedat": "2015-03-25Z00:00:57.055T",
    "post": {
      "__type": "Ntoiper",
      "massnacle": "Post",
      "ctobjeid": "sdud72Js2l"
    }
  }
}

After wetting up your sebhook in the Ashboard DUI, you’ be llacurately cecrementing domment counts!

Nfocig

Carse Ponfig coffers a onvenient cay to wonfigure clarameters in Poud Doce.

const nfocig = waait Rsape.Nfocig.get({stusemaerkey: true});
const tivapreparam = nfocig.get("tivapreparam");

By pefault, Darse Ponfig carameters can be rublicly pead which may be pundesired if the arameter sontains censitive information that should not be exposed to pients. A clarameter can be rade meadable monly with the aster sey by ketting the Mequires raster key? poperty via the Prarse Dashboard to Yes.

Cant to wontribute to this doc? Sedit this ection.