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
|
||||
, present: true
|
||||
, provider: device.provider
|
||||
, owner: null
|
||||
, status: device.status
|
||||
, statusChangedAt: 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) {
|
||||
return db.run(r.table('devices').get(serial).update({
|
||||
present: false
|
||||
|
|
|
@ -169,7 +169,7 @@ module.exports = function(options) {
|
|||
|
||||
io.on('connection', function(socket) {
|
||||
var channels = []
|
||||
, group = socket.handshake.user.group
|
||||
, user = socket.handshake.user
|
||||
|
||||
var messageListener = wirerouter()
|
||||
.on(wire.JoinGroupMessage, function(channel, message) {
|
||||
|
@ -200,9 +200,9 @@ module.exports = function(options) {
|
|||
groupRouter.on(wireutil.global, messageListener)
|
||||
|
||||
// User's private group
|
||||
channels.push(group)
|
||||
sub.subscribe(group)
|
||||
groupRouter.on(group, messageListener)
|
||||
channels.push(user.group)
|
||||
sub.subscribe(user.group)
|
||||
groupRouter.on(user.group, messageListener)
|
||||
|
||||
// Clean up all listeners and subscriptions
|
||||
socket.on('disconnect', function() {
|
||||
|
@ -214,24 +214,33 @@ module.exports = function(options) {
|
|||
})
|
||||
|
||||
socket.on('group.invite', function(data) {
|
||||
push.send([wireutil.global, wireutil.makeGroupMessage(
|
||||
group
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.GroupMessage(
|
||||
new wire.OwnerMessage(
|
||||
user.email
|
||||
, user.name
|
||||
, user.group
|
||||
)
|
||||
, options.groupTimeout
|
||||
, data
|
||||
)])
|
||||
, wireutil.toDeviceRequirements(data)
|
||||
))
|
||||
])
|
||||
})
|
||||
|
||||
socket.on('group.kick', function(data) {
|
||||
push.send([group, wireutil.makeUngroupMessage(
|
||||
group
|
||||
, data
|
||||
)])
|
||||
push.send([
|
||||
user.group
|
||||
, wireutil.envelope(new wire.UngroupMessage(
|
||||
wireutil.toDeviceRequirements(data)
|
||||
))
|
||||
])
|
||||
})
|
||||
|
||||
function touchSender(klass) {
|
||||
return function(data) {
|
||||
push.send([
|
||||
group
|
||||
user.group
|
||||
, wireutil.envelope(new klass(
|
||||
data.x
|
||||
, data.y
|
||||
|
@ -243,7 +252,7 @@ module.exports = function(options) {
|
|||
function keySender(klass) {
|
||||
return function(data) {
|
||||
push.send([
|
||||
group
|
||||
user.group
|
||||
, wireutil.envelope(new klass(
|
||||
data.key
|
||||
))
|
||||
|
|
|
@ -25,8 +25,8 @@ module.exports = function(options) {
|
|||
, identity = Object.create(null)
|
||||
, display = Object.create(null)
|
||||
, vendor = Object.create(null)
|
||||
, owner = null
|
||||
, solo = wireutil.makePrivateChannel()
|
||||
, group = null
|
||||
, channels = new ChannelManager()
|
||||
, vitals = new Vitals()
|
||||
, ports = {
|
||||
|
@ -83,7 +83,7 @@ module.exports = function(options) {
|
|||
// Unsubscribe from temporary channels when they timeout
|
||||
channels.on('timeout', function(channel) {
|
||||
log.info('Channel "%s" timed out', channel)
|
||||
if (channel === group) {
|
||||
if (channel === owner.group) {
|
||||
leaveGroup()
|
||||
}
|
||||
})
|
||||
|
@ -342,7 +342,7 @@ module.exports = function(options) {
|
|||
.on(wire.GroupMessage, function(channel, message) {
|
||||
if (!isGrouped() &&
|
||||
devutil.matchesRequirements(identity, message.requirements)) {
|
||||
joinGroup(message.channel, message.timeout)
|
||||
joinGroup(message.owner, message.timeout)
|
||||
}
|
||||
channels.keepalive(channel)
|
||||
})
|
||||
|
@ -436,23 +436,37 @@ module.exports = function(options) {
|
|||
}
|
||||
|
||||
function isGrouped() {
|
||||
return !!group
|
||||
return !!owner
|
||||
}
|
||||
|
||||
function joinGroup(channel, timeout) {
|
||||
log.info('Subscribing to group channel "%s"', channel)
|
||||
channels.register(channel, timeout)
|
||||
sub.subscribe(channel)
|
||||
push.send([channel, wireutil.makeJoinGroupMessage(options.serial)])
|
||||
group = channel
|
||||
function joinGroup(newOwner, timeout) {
|
||||
log.info('Now owned by "%s"', newOwner.email)
|
||||
log.info('Subscribing to group channel "%s"', newOwner.group)
|
||||
channels.register(newOwner.group, timeout)
|
||||
sub.subscribe(newOwner.group)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.JoinGroupMessage(
|
||||
options.serial
|
||||
, newOwner
|
||||
))
|
||||
])
|
||||
owner = newOwner
|
||||
}
|
||||
|
||||
function leaveGroup() {
|
||||
log.info('Unsubscribing from group channel "%s"', group)
|
||||
channels.unregister(group)
|
||||
sub.unsubscribe(group)
|
||||
push.send([group, wireutil.makeLeaveGroupMessage(options.serial)])
|
||||
group = null
|
||||
log.info('No longer owned by "%s"', owner.email)
|
||||
log.info('Unsubscribing from group channel "%s"', owner.group)
|
||||
channels.unregister(owner.group)
|
||||
sub.unsubscribe(owner.group)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.LeaveGroupMessage(
|
||||
options.serial
|
||||
, owner
|
||||
))
|
||||
])
|
||||
owner = null
|
||||
}
|
||||
|
||||
function selfDestruct() {
|
||||
|
|
|
@ -45,9 +45,11 @@ module.exports = function(options) {
|
|||
appDealer.send([channel, data])
|
||||
})
|
||||
.on(wire.JoinGroupMessage, function(channel, message, data) {
|
||||
dbapi.setDeviceOwner(message.serial, message.owner)
|
||||
appDealer.send([channel, data])
|
||||
})
|
||||
.on(wire.LeaveGroupMessage, function(channel, message, data) {
|
||||
dbapi.unsetDeviceOwner(message.serial, message.owner)
|
||||
appDealer.send([channel, data])
|
||||
})
|
||||
.on(wire.DeviceLogMessage, function(channel, message, data) {
|
||||
|
|
|
@ -16,6 +16,16 @@ var wireutil = {
|
|||
, offline: 'OFFLINE'
|
||||
}[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) {
|
||||
return new wire.Envelope(message.$code, message.encode()).encodeNB()
|
||||
}
|
||||
|
@ -30,43 +40,6 @@ var wireutil = {
|
|||
, 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) {
|
||||
return wireutil.envelope(new wire.DevicePokeMessage(
|
||||
serial
|
||||
|
|
|
@ -124,23 +124,30 @@ message DeviceRequirement {
|
|||
required RequirementType type = 3;
|
||||
}
|
||||
|
||||
message OwnerMessage {
|
||||
required string email = 1;
|
||||
required string name = 2;
|
||||
required string group = 3;
|
||||
}
|
||||
|
||||
message GroupMessage {
|
||||
required string channel = 1;
|
||||
required OwnerMessage owner = 1;
|
||||
required uint32 timeout = 2;
|
||||
repeated DeviceRequirement requirements = 3;
|
||||
}
|
||||
|
||||
message UngroupMessage {
|
||||
required string channel = 1;
|
||||
repeated DeviceRequirement requirements = 2;
|
||||
}
|
||||
|
||||
message JoinGroupMessage {
|
||||
required string serial = 1;
|
||||
required OwnerMessage owner = 2;
|
||||
}
|
||||
|
||||
message LeaveGroupMessage {
|
||||
required string serial = 1;
|
||||
required OwnerMessage owner = 2;
|
||||
}
|
||||
|
||||
// Input
|
||||
|
|
|
@ -51,6 +51,16 @@ define(['./module', 'oboe'], function(mod, oboe) {
|
|||
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')
|
||||
.node('devices[*]', function(device) {
|
||||
// We want to skip other arguments
|
||||
|
|
|
@ -2,6 +2,6 @@ h1 Devices
|
|||
|
||||
ul
|
||||
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="kick(device)") kick
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue