Add idempotency (#6748)
* added idempotency router and middleware * added idempotency rules for routes classes, functions, jobs, installaions, users * fixed typo * ignore requests without header * removed unused var * enabled feature only for MongoDB * changed code comment * fixed inconsistend storage adapter specification * Trigger notification * Travis CI trigger * Travis CI trigger * Travis CI trigger * rebuilt option definitions * fixed incorrect import path * added new request ID header to allowed headers * fixed typescript typos * add new system class to spec helper * fixed typescript typos * re-added postgres conn parameter * removed postgres conn parameter * fixed incorrect schema for index creation * temporarily disabling index creation to fix postgres issue * temporarily disabling index creation to fix postgres issue * temporarily disabling index creation to fix postgres issue * temporarily disabling index creation to fix postgres issue * temporarily disabling index creation to fix postgres issue * temporarily disabling index creation to fix postgres issue * temporarily disabling index creation to fix postgres issue * trying to fix postgres issue * fixed incorrect auth when writing to _Idempotency * trying to fix postgres issue * Travis CI trigger * added test cases * removed number grouping * fixed test description * trying to fix postgres issue * added Github readme docs * added change log * refactored tests; fixed some typos * fixed test case * fixed default TTL value * Travis CI Trigger * Travis CI Trigger * Travis CI Trigger * added test case to increase coverage * Trigger Travis CI * changed configuration syntax to use regex; added test cases * removed unused vars * removed IdempotencyRouter * Trigger Travis CI * updated docs * updated docs * updated docs * updated docs * update docs * Trigger Travis CI * fixed coverage * removed code comments
This commit is contained in:
@@ -2,6 +2,7 @@ import PromiseRouter from '../PromiseRouter';
|
||||
import rest from '../rest';
|
||||
import _ from 'lodash';
|
||||
import Parse from 'parse/node';
|
||||
import { promiseEnsureIdempotency } from '../middlewares';
|
||||
|
||||
const ALLOWED_GET_QUERY_KEYS = [
|
||||
'keys',
|
||||
@@ -247,10 +248,10 @@ export class ClassesRouter extends PromiseRouter {
|
||||
this.route('GET', '/classes/:className/:objectId', req => {
|
||||
return this.handleGet(req);
|
||||
});
|
||||
this.route('POST', '/classes/:className', req => {
|
||||
this.route('POST', '/classes/:className', promiseEnsureIdempotency, req => {
|
||||
return this.handleCreate(req);
|
||||
});
|
||||
this.route('PUT', '/classes/:className/:objectId', req => {
|
||||
this.route('PUT', '/classes/:className/:objectId', promiseEnsureIdempotency, req => {
|
||||
return this.handleUpdate(req);
|
||||
});
|
||||
this.route('DELETE', '/classes/:className/:objectId', req => {
|
||||
|
||||
@@ -4,7 +4,7 @@ var Parse = require('parse/node').Parse,
|
||||
triggers = require('../triggers');
|
||||
|
||||
import PromiseRouter from '../PromiseRouter';
|
||||
import { promiseEnforceMasterKeyAccess } from '../middlewares';
|
||||
import { promiseEnforceMasterKeyAccess, promiseEnsureIdempotency } from '../middlewares';
|
||||
import { jobStatusHandler } from '../StatusHandler';
|
||||
import _ from 'lodash';
|
||||
import { logger } from '../logger';
|
||||
@@ -34,11 +34,13 @@ export class FunctionsRouter extends PromiseRouter {
|
||||
this.route(
|
||||
'POST',
|
||||
'/functions/:functionName',
|
||||
promiseEnsureIdempotency,
|
||||
FunctionsRouter.handleCloudFunction
|
||||
);
|
||||
this.route(
|
||||
'POST',
|
||||
'/jobs/:jobName',
|
||||
promiseEnsureIdempotency,
|
||||
promiseEnforceMasterKeyAccess,
|
||||
function (req) {
|
||||
return FunctionsRouter.handleCloudJob(req);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import ClassesRouter from './ClassesRouter';
|
||||
import rest from '../rest';
|
||||
import { promiseEnsureIdempotency } from '../middlewares';
|
||||
|
||||
export class InstallationsRouter extends ClassesRouter {
|
||||
className() {
|
||||
@@ -36,10 +37,10 @@ export class InstallationsRouter extends ClassesRouter {
|
||||
this.route('GET', '/installations/:objectId', req => {
|
||||
return this.handleGet(req);
|
||||
});
|
||||
this.route('POST', '/installations', req => {
|
||||
this.route('POST', '/installations', promiseEnsureIdempotency, req => {
|
||||
return this.handleCreate(req);
|
||||
});
|
||||
this.route('PUT', '/installations/:objectId', req => {
|
||||
this.route('PUT', '/installations/:objectId', promiseEnsureIdempotency, req => {
|
||||
return this.handleUpdate(req);
|
||||
});
|
||||
this.route('DELETE', '/installations/:objectId', req => {
|
||||
|
||||
@@ -8,6 +8,7 @@ import rest from '../rest';
|
||||
import Auth from '../Auth';
|
||||
import passwordCrypto from '../password';
|
||||
import { maybeRunTrigger, Types as TriggerTypes } from '../triggers';
|
||||
import { promiseEnsureIdempotency } from '../middlewares';
|
||||
|
||||
export class UsersRouter extends ClassesRouter {
|
||||
className() {
|
||||
@@ -445,7 +446,7 @@ export class UsersRouter extends ClassesRouter {
|
||||
this.route('GET', '/users', req => {
|
||||
return this.handleFind(req);
|
||||
});
|
||||
this.route('POST', '/users', req => {
|
||||
this.route('POST', '/users', promiseEnsureIdempotency, req => {
|
||||
return this.handleCreate(req);
|
||||
});
|
||||
this.route('GET', '/users/me', req => {
|
||||
@@ -454,7 +455,7 @@ export class UsersRouter extends ClassesRouter {
|
||||
this.route('GET', '/users/:objectId', req => {
|
||||
return this.handleGet(req);
|
||||
});
|
||||
this.route('PUT', '/users/:objectId', req => {
|
||||
this.route('PUT', '/users/:objectId', promiseEnsureIdempotency, req => {
|
||||
return this.handleUpdate(req);
|
||||
});
|
||||
this.route('DELETE', '/users/:objectId', req => {
|
||||
|
||||
Reference in New Issue
Block a user