1
0
Fork 0
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:
Simo Kinnunen 2014-02-04 20:33:53 +09:00
parent 3e7d91cb91
commit 37303c5d92
8 changed files with 98 additions and 70 deletions

View file

@ -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

View file

@ -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
)) ))

View file

@ -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() {

View file

@ -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) {

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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