Add support for more audience fields. (#4145)

* Add support for more audience fields.

* Only update audience when defined audience_id.
This commit is contained in:
Anthony Mosca
2017-09-12 11:36:21 +09:30
committed by Florent Vilmart
parent 9fbb5e29e8
commit 4dce3bd63c
6 changed files with 160 additions and 17 deletions

View File

@@ -10,6 +10,8 @@ const transformKey = (className, fieldName, schema) => {
case 'createdAt': return '_created_at';
case 'updatedAt': return '_updated_at';
case 'sessionToken': return '_session_token';
case 'lastUsed': return '_last_used';
case 'timesUsed': return 'times_used';
}
if (schema.fields[fieldName] && schema.fields[fieldName].__type == 'Pointer') {
@@ -77,6 +79,16 @@ const transformKeyValueForUpdate = (className, restKey, restValue, parseFormatSc
case '_rperm':
case '_wperm':
return {key: key, value: restValue};
case 'lastUsed':
case '_last_used':
key = '_last_used';
timeField = true;
break;
case 'timesUsed':
case 'times_used':
key = 'times_used';
timeField = true;
break;
}
if ((parseFormatSchema.fields[key] && parseFormatSchema.fields[key].type === 'Pointer') || (!parseFormatSchema.fields[key] && restValue && restValue.__type == 'Pointer')) {
@@ -200,6 +212,14 @@ function transformQueryKeyValue(className, key, value, schema) {
return {key: '$or', value: value.map(subQuery => transformWhere(className, subQuery, schema))};
case '$and':
return {key: '$and', value: value.map(subQuery => transformWhere(className, subQuery, schema))};
case 'lastUsed':
if (valueAsDate(value)) {
return {key: '_last_used', value: valueAsDate(value)}
}
key = '_last_used';
break;
case 'timesUsed':
return {key: 'times_used', value: value};
default: {
// Other auth data
const authDataMatch = key.match(/^authData\.([a-zA-Z0-9_]+)\.id$/);
@@ -923,11 +943,15 @@ const mongoObjectToParseObject = (className, mongoObject, schema) => {
case '_expiresAt':
restObject['expiresAt'] = Parse._encode(new Date(mongoObject[key]));
break;
case 'lastUsed':
case '_last_used':
restObject['lastUsed'] = Parse._encode(new Date(mongoObject[key])).iso;
break;
case 'timesUsed':
case 'times_used':
restObject['timesUsed'] = mongoObject[key];
break;
default:
if (className === '_Audience' && (key === '_last_used' || key === 'times_used')) {
// Ignore these parse.com legacy fields
break;
}
// Check other auth data keys
var authDataMatch = key.match(/^_auth_data_([a-zA-Z0-9_]+)$/);
if (authDataMatch) {

View File

@@ -54,6 +54,20 @@ export class PushController {
}).then(() => {
onPushStatusSaved(pushStatus.objectId);
return badgeUpdate();
}).then(() => {
// Update audience lastUsed and timesUsed
if (body.audience_id) {
const audienceId = body.audience_id;
var updateAudience = {
lastUsed: { __type: "Date", iso: new Date().toISOString() },
timesUsed: { __op: "Increment", "amount": 1 }
};
const write = new RestWrite(config, master(config), '_Audience', {objectId: audienceId}, updateAudience);
write.execute();
}
// Don't wait for the audience update promise to resolve.
return Promise.resolve();
}).then(() => {
if (body.hasOwnProperty('push_time') && config.hasPushScheduledSupport) {
return Promise.resolve();

View File

@@ -113,12 +113,14 @@ const defaultColumns = Object.freeze({
},
_GlobalConfig: {
"objectId": {type: 'String'},
"params": {type: 'Object'}
"params": {type: 'Object'}
},
_Audience: {
"objectId": {type:'String'},
"name": {type:'String'},
"query": {type:'String'} //storing query as JSON string to prevent "Nested keys should not contain the '$' or '.' characters" error
"objectId": {type:'String'},
"name": {type:'String'},
"query": {type:'String'}, //storing query as JSON string to prevent "Nested keys should not contain the '$' or '.' characters" error
"lastUsed": {type:'Date'},
"timesUsed": {type:'Number'}
}
});