mirror of
https://github.com/openstf/stf
synced 2025-10-04 02:09:32 +02:00
Add owners to groups.
This commit is contained in:
parent
3e7d91cb91
commit
37303c5d92
8 changed files with 98 additions and 70 deletions
|
@ -46,6 +46,7 @@ dbapi.saveDevice = function(serial, device) {
|
||||||
serial: serial
|
serial: serial
|
||||||
, present: true
|
, present: true
|
||||||
, provider: device.provider
|
, provider: device.provider
|
||||||
|
, owner: null
|
||||||
, status: device.status
|
, status: device.status
|
||||||
, statusChangedAt: r.now()
|
, statusChangedAt: r.now()
|
||||||
, createdAt: r.now()
|
, createdAt: r.now()
|
||||||
|
@ -65,6 +66,18 @@ dbapi.saveDeviceStatus = function(serial, status) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dbapi.setDeviceOwner = function(serial, owner) {
|
||||||
|
return db.run(r.table('devices').get(serial).update({
|
||||||
|
owner: owner
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
dbapi.unsetDeviceOwner = function(serial, owner) {
|
||||||
|
return db.run(r.table('devices').get(serial).update({
|
||||||
|
owner: null
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
dbapi.setDeviceAbsent = function(serial) {
|
dbapi.setDeviceAbsent = function(serial) {
|
||||||
return db.run(r.table('devices').get(serial).update({
|
return db.run(r.table('devices').get(serial).update({
|
||||||
present: false
|
present: false
|
||||||
|
|
|
@ -169,7 +169,7 @@ module.exports = function(options) {
|
||||||
|
|
||||||
io.on('connection', function(socket) {
|
io.on('connection', function(socket) {
|
||||||
var channels = []
|
var channels = []
|
||||||
, group = socket.handshake.user.group
|
, user = socket.handshake.user
|
||||||
|
|
||||||
var messageListener = wirerouter()
|
var messageListener = wirerouter()
|
||||||
.on(wire.JoinGroupMessage, function(channel, message) {
|
.on(wire.JoinGroupMessage, function(channel, message) {
|
||||||
|
@ -200,9 +200,9 @@ module.exports = function(options) {
|
||||||
groupRouter.on(wireutil.global, messageListener)
|
groupRouter.on(wireutil.global, messageListener)
|
||||||
|
|
||||||
// User's private group
|
// User's private group
|
||||||
channels.push(group)
|
channels.push(user.group)
|
||||||
sub.subscribe(group)
|
sub.subscribe(user.group)
|
||||||
groupRouter.on(group, messageListener)
|
groupRouter.on(user.group, messageListener)
|
||||||
|
|
||||||
// Clean up all listeners and subscriptions
|
// Clean up all listeners and subscriptions
|
||||||
socket.on('disconnect', function() {
|
socket.on('disconnect', function() {
|
||||||
|
@ -214,24 +214,33 @@ module.exports = function(options) {
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.on('group.invite', function(data) {
|
socket.on('group.invite', function(data) {
|
||||||
push.send([wireutil.global, wireutil.makeGroupMessage(
|
push.send([
|
||||||
group
|
wireutil.global
|
||||||
|
, wireutil.envelope(new wire.GroupMessage(
|
||||||
|
new wire.OwnerMessage(
|
||||||
|
user.email
|
||||||
|
, user.name
|
||||||
|
, user.group
|
||||||
|
)
|
||||||
, options.groupTimeout
|
, options.groupTimeout
|
||||||
, data
|
, wireutil.toDeviceRequirements(data)
|
||||||
)])
|
))
|
||||||
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.on('group.kick', function(data) {
|
socket.on('group.kick', function(data) {
|
||||||
push.send([group, wireutil.makeUngroupMessage(
|
push.send([
|
||||||
group
|
user.group
|
||||||
, data
|
, wireutil.envelope(new wire.UngroupMessage(
|
||||||
)])
|
wireutil.toDeviceRequirements(data)
|
||||||
|
))
|
||||||
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
function touchSender(klass) {
|
function touchSender(klass) {
|
||||||
return function(data) {
|
return function(data) {
|
||||||
push.send([
|
push.send([
|
||||||
group
|
user.group
|
||||||
, wireutil.envelope(new klass(
|
, wireutil.envelope(new klass(
|
||||||
data.x
|
data.x
|
||||||
, data.y
|
, data.y
|
||||||
|
@ -243,7 +252,7 @@ module.exports = function(options) {
|
||||||
function keySender(klass) {
|
function keySender(klass) {
|
||||||
return function(data) {
|
return function(data) {
|
||||||
push.send([
|
push.send([
|
||||||
group
|
user.group
|
||||||
, wireutil.envelope(new klass(
|
, wireutil.envelope(new klass(
|
||||||
data.key
|
data.key
|
||||||
))
|
))
|
||||||
|
|
|
@ -25,8 +25,8 @@ module.exports = function(options) {
|
||||||
, identity = Object.create(null)
|
, identity = Object.create(null)
|
||||||
, display = Object.create(null)
|
, display = Object.create(null)
|
||||||
, vendor = Object.create(null)
|
, vendor = Object.create(null)
|
||||||
|
, owner = null
|
||||||
, solo = wireutil.makePrivateChannel()
|
, solo = wireutil.makePrivateChannel()
|
||||||
, group = null
|
|
||||||
, channels = new ChannelManager()
|
, channels = new ChannelManager()
|
||||||
, vitals = new Vitals()
|
, vitals = new Vitals()
|
||||||
, ports = {
|
, ports = {
|
||||||
|
@ -83,7 +83,7 @@ module.exports = function(options) {
|
||||||
// Unsubscribe from temporary channels when they timeout
|
// Unsubscribe from temporary channels when they timeout
|
||||||
channels.on('timeout', function(channel) {
|
channels.on('timeout', function(channel) {
|
||||||
log.info('Channel "%s" timed out', channel)
|
log.info('Channel "%s" timed out', channel)
|
||||||
if (channel === group) {
|
if (channel === owner.group) {
|
||||||
leaveGroup()
|
leaveGroup()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -342,7 +342,7 @@ module.exports = function(options) {
|
||||||
.on(wire.GroupMessage, function(channel, message) {
|
.on(wire.GroupMessage, function(channel, message) {
|
||||||
if (!isGrouped() &&
|
if (!isGrouped() &&
|
||||||
devutil.matchesRequirements(identity, message.requirements)) {
|
devutil.matchesRequirements(identity, message.requirements)) {
|
||||||
joinGroup(message.channel, message.timeout)
|
joinGroup(message.owner, message.timeout)
|
||||||
}
|
}
|
||||||
channels.keepalive(channel)
|
channels.keepalive(channel)
|
||||||
})
|
})
|
||||||
|
@ -436,23 +436,37 @@ module.exports = function(options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function isGrouped() {
|
function isGrouped() {
|
||||||
return !!group
|
return !!owner
|
||||||
}
|
}
|
||||||
|
|
||||||
function joinGroup(channel, timeout) {
|
function joinGroup(newOwner, timeout) {
|
||||||
log.info('Subscribing to group channel "%s"', channel)
|
log.info('Now owned by "%s"', newOwner.email)
|
||||||
channels.register(channel, timeout)
|
log.info('Subscribing to group channel "%s"', newOwner.group)
|
||||||
sub.subscribe(channel)
|
channels.register(newOwner.group, timeout)
|
||||||
push.send([channel, wireutil.makeJoinGroupMessage(options.serial)])
|
sub.subscribe(newOwner.group)
|
||||||
group = channel
|
push.send([
|
||||||
|
wireutil.global
|
||||||
|
, wireutil.envelope(new wire.JoinGroupMessage(
|
||||||
|
options.serial
|
||||||
|
, newOwner
|
||||||
|
))
|
||||||
|
])
|
||||||
|
owner = newOwner
|
||||||
}
|
}
|
||||||
|
|
||||||
function leaveGroup() {
|
function leaveGroup() {
|
||||||
log.info('Unsubscribing from group channel "%s"', group)
|
log.info('No longer owned by "%s"', owner.email)
|
||||||
channels.unregister(group)
|
log.info('Unsubscribing from group channel "%s"', owner.group)
|
||||||
sub.unsubscribe(group)
|
channels.unregister(owner.group)
|
||||||
push.send([group, wireutil.makeLeaveGroupMessage(options.serial)])
|
sub.unsubscribe(owner.group)
|
||||||
group = null
|
push.send([
|
||||||
|
wireutil.global
|
||||||
|
, wireutil.envelope(new wire.LeaveGroupMessage(
|
||||||
|
options.serial
|
||||||
|
, owner
|
||||||
|
))
|
||||||
|
])
|
||||||
|
owner = null
|
||||||
}
|
}
|
||||||
|
|
||||||
function selfDestruct() {
|
function selfDestruct() {
|
||||||
|
|
|
@ -45,9 +45,11 @@ module.exports = function(options) {
|
||||||
appDealer.send([channel, data])
|
appDealer.send([channel, data])
|
||||||
})
|
})
|
||||||
.on(wire.JoinGroupMessage, function(channel, message, data) {
|
.on(wire.JoinGroupMessage, function(channel, message, data) {
|
||||||
|
dbapi.setDeviceOwner(message.serial, message.owner)
|
||||||
appDealer.send([channel, data])
|
appDealer.send([channel, data])
|
||||||
})
|
})
|
||||||
.on(wire.LeaveGroupMessage, function(channel, message, data) {
|
.on(wire.LeaveGroupMessage, function(channel, message, data) {
|
||||||
|
dbapi.unsetDeviceOwner(message.serial, message.owner)
|
||||||
appDealer.send([channel, data])
|
appDealer.send([channel, data])
|
||||||
})
|
})
|
||||||
.on(wire.DeviceLogMessage, function(channel, message, data) {
|
.on(wire.DeviceLogMessage, function(channel, message, data) {
|
||||||
|
|
|
@ -16,6 +16,16 @@ var wireutil = {
|
||||||
, offline: 'OFFLINE'
|
, offline: 'OFFLINE'
|
||||||
}[type]]
|
}[type]]
|
||||||
}
|
}
|
||||||
|
, toDeviceRequirements: function(requirements) {
|
||||||
|
return Object.keys(requirements).map(function(name) {
|
||||||
|
var item = requirements[name]
|
||||||
|
return new wire.DeviceRequirement(
|
||||||
|
name
|
||||||
|
, item.value
|
||||||
|
, wire.RequirementType[item.match.toUpperCase()]
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
, envelope: function(message) {
|
, envelope: function(message) {
|
||||||
return new wire.Envelope(message.$code, message.encode()).encodeNB()
|
return new wire.Envelope(message.$code, message.encode()).encodeNB()
|
||||||
}
|
}
|
||||||
|
@ -30,43 +40,6 @@ var wireutil = {
|
||||||
, entry.identifier
|
, entry.identifier
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
, makeGroupMessage: function(channel, timeout, requirements) {
|
|
||||||
return wireutil.envelope(new wire.GroupMessage(
|
|
||||||
channel
|
|
||||||
, timeout
|
|
||||||
, Object.keys(requirements).map(function(name) {
|
|
||||||
var item = requirements[name]
|
|
||||||
return new wire.DeviceRequirement(
|
|
||||||
name
|
|
||||||
, item.value
|
|
||||||
, wire.RequirementType[item.match.toUpperCase()]
|
|
||||||
)
|
|
||||||
})
|
|
||||||
))
|
|
||||||
}
|
|
||||||
, makeUngroupMessage: function(channel, requirements) {
|
|
||||||
return wireutil.envelope(new wire.UngroupMessage(
|
|
||||||
channel
|
|
||||||
, Object.keys(requirements).map(function(name) {
|
|
||||||
var item = requirements[name]
|
|
||||||
return new wire.DeviceRequirement(
|
|
||||||
name
|
|
||||||
, item.value
|
|
||||||
, wire.RequirementType[item.match.toUpperCase()]
|
|
||||||
)
|
|
||||||
})
|
|
||||||
))
|
|
||||||
}
|
|
||||||
, makeJoinGroupMessage: function(serial) {
|
|
||||||
return wireutil.envelope(new wire.JoinGroupMessage(
|
|
||||||
serial
|
|
||||||
))
|
|
||||||
}
|
|
||||||
, makeLeaveGroupMessage: function(serial) {
|
|
||||||
return wireutil.envelope(new wire.LeaveGroupMessage(
|
|
||||||
serial
|
|
||||||
))
|
|
||||||
}
|
|
||||||
, makeDevicePokeMessage: function(serial, channel) {
|
, makeDevicePokeMessage: function(serial, channel) {
|
||||||
return wireutil.envelope(new wire.DevicePokeMessage(
|
return wireutil.envelope(new wire.DevicePokeMessage(
|
||||||
serial
|
serial
|
||||||
|
|
|
@ -124,23 +124,30 @@ message DeviceRequirement {
|
||||||
required RequirementType type = 3;
|
required RequirementType type = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message OwnerMessage {
|
||||||
|
required string email = 1;
|
||||||
|
required string name = 2;
|
||||||
|
required string group = 3;
|
||||||
|
}
|
||||||
|
|
||||||
message GroupMessage {
|
message GroupMessage {
|
||||||
required string channel = 1;
|
required OwnerMessage owner = 1;
|
||||||
required uint32 timeout = 2;
|
required uint32 timeout = 2;
|
||||||
repeated DeviceRequirement requirements = 3;
|
repeated DeviceRequirement requirements = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
message UngroupMessage {
|
message UngroupMessage {
|
||||||
required string channel = 1;
|
|
||||||
repeated DeviceRequirement requirements = 2;
|
repeated DeviceRequirement requirements = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message JoinGroupMessage {
|
message JoinGroupMessage {
|
||||||
required string serial = 1;
|
required string serial = 1;
|
||||||
|
required OwnerMessage owner = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LeaveGroupMessage {
|
message LeaveGroupMessage {
|
||||||
required string serial = 1;
|
required string serial = 1;
|
||||||
|
required OwnerMessage owner = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
|
|
|
@ -51,6 +51,16 @@ define(['./module', 'oboe'], function(mod, oboe) {
|
||||||
modify(get(data), data)
|
modify(get(data), data)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
socket.on('group.join', function(data) {
|
||||||
|
modify(get(data), data)
|
||||||
|
})
|
||||||
|
|
||||||
|
socket.on('group.leave', function(data) {
|
||||||
|
modify(get(data), {
|
||||||
|
owner: null
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
oboe('/api/v1/devices')
|
oboe('/api/v1/devices')
|
||||||
.node('devices[*]', function(device) {
|
.node('devices[*]', function(device) {
|
||||||
// We want to skip other arguments
|
// We want to skip other arguments
|
||||||
|
|
|
@ -2,6 +2,6 @@ h1 Devices
|
||||||
|
|
||||||
ul
|
ul
|
||||||
li(ng-repeat='device in devices track by device.serial')
|
li(ng-repeat='device in devices track by device.serial')
|
||||||
span {{ device.serial }}
|
span {{ device.serial }} {{ device.present ? 'present' : 'absent' }} {{ device.owner.email }}
|
||||||
button(ng-click="invite(device)") invite
|
button(ng-click="invite(device)") invite
|
||||||
button(ng-click="kick(device)") kick
|
button(ng-click="kick(device)") kick
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue