diff --git a/src/base-apis.js b/src/base-apis.js index a85ed9bc6f5..c28235de194 100644 --- a/src/base-apis.js +++ b/src/base-apis.js @@ -446,6 +446,18 @@ function(roomId, includeMembership, excludeMembership, atEventId, callback) { return this._http.authedRequest(callback, "GET", path); }; +/** + * Upgrades a room to a new protocol version + * @param {string} roomId + * @param {string} newVersion The target version to upgrade to + * @return {module:client.Promise} Resolves: Object with key 'replacement_room' + * @return {module:http-api.MatrixError} Rejects: with an error response. + */ +MatrixBaseApis.prototype.upgradeRoom = function(roomId, newVersion) { + const path = utils.encodeUri("/rooms/$roomId/upgrade", {$roomId: roomId}); + return this._http.authedRequest(undefined, "POST", path, undefined, {new_version: newVersion}); +}; + /** * @param {string} groupId diff --git a/src/models/room.js b/src/models/room.js index 92983d403a4..25a9ef5ef95 100644 --- a/src/models/room.js +++ b/src/models/room.js @@ -29,6 +29,9 @@ const EventTimelineSet = require("./event-timeline-set"); import ReEmitter from '../ReEmitter'; +//const LATEST_ROOM_VERSION = '1'; +const LATEST_ROOM_VERSION = 'badger'; + function synthesizeReceipt(userId, event, receiptType) { // console.log("synthesizing receipt for "+event.getId()); // This is really ugly because JS has no way to express an object literal @@ -200,6 +203,27 @@ Room.prototype.getVersion = function() { return ver; }; +/** + * Determines whether this room needs to be upgraded to a new version + * @returns {string?} What version the room should be upgraded to, or null if + * the room does not require upgrading at this time. + */ +Room.prototype.shouldUpgradeToVersion = function() { + // This almost certainly won't be the way this actually works - this + // is essentially a stub method. + if (this.getVersion() === LATEST_ROOM_VERSION) return null; + return LATEST_ROOM_VERSION; +}; + +/** + * Determines whether the given user is permitted to perform a room upgrade + * @param {String} userId The ID of the user to test against + * @returns {bool} True if the given user is permitted to upgrade the room + */ +Room.prototype.userMayUpgradeRoom = function(userId) { + return this.currentState.maySendStateEvent("m.room.tombstone", userId); +}; + /** * Get the list of pending sent events for this room *