@@ -7,6 +7,7 @@ const CourseInvite = require('../models/courseInvite');
77const CourseGroup = require ( '../models/courseGroup' ) ;
88const sendOrderInvites = require ( './sendOrderInvites' ) ;
99const xmppClient = require ( 'xmppClient' ) ;
10+ const VideoKey = require ( 'videoKey' ) . VideoKey ;
1011
1112// not a middleware
1213// can be called from CRON
@@ -40,11 +41,35 @@ module.exports = function* (order) {
4041 user : order . user . _id ,
4142 courseName : order . data . contactName
4243 } ) ;
43- yield group . persist ( ) ;
44+ group . participantsLimit -- ;
4445 }
46+ if ( group . participantsLimit < 0 ) group . participantsLimit = 0 ;
47+ if ( group . participantsLimit === 0 ) {
48+ group . isOpenForSignup = false ; // we're full!
49+ }
50+ yield group . persist ( ) ;
4551
4652 yield * sendOrderInvites ( order ) ;
4753
54+ yield CourseGroup . populate ( group , [ { path : 'participants.user' } , { path : 'course' } ] ) ;
55+
56+ yield * grantXmppChatMemberships ( group ) ;
57+
58+ if ( group . course . videoKeyTag ) {
59+ yield * grantVideoKeys ( group ) ;
60+ }
61+
62+
63+ order . status = Order . STATUS_SUCCESS ;
64+
65+ yield order . persist ( ) ;
66+
67+ log . debug ( "Order success: " + order . number ) ;
68+ } ;
69+
70+
71+ function * grantXmppChatMemberships ( group ) {
72+ log . debug ( "Grant xmpp chat membership" ) ;
4873 // grant membership in chat
4974 var client = new xmppClient ( {
5075 jid : config . xmpp . admin . login + '/host' ,
@@ -58,18 +83,50 @@ module.exports = function* (order) {
5883 membersOnly : 1
5984 } ) ;
6085
61- yield CourseGroup . populate ( group , { path : 'participants.user' } ) ;
6286
87+ var jobs = [ ] ;
6388 for ( var i = 0 ; i < group . participants . length ; i ++ ) {
6489 var participant = group . participants [ i ] ;
65- yield client . grantMember ( roomJid , participant . user . profileName , participant . courseName ) ;
90+
91+ log . debug ( "grant " + roomJid + " to" , participant . user . profileName , participant . courseName ) ;
92+
93+ jobs . push ( client . grantMember ( roomJid , participant . user . profileName , participant . courseName ) ) ;
6694 }
6795
96+ // grant all in parallel
97+ yield jobs ;
98+
6899 client . disconnect ( ) ;
100+ }
69101
70- order . status = Order . STATUS_SUCCESS ;
102+ function * grantVideoKeys ( group ) {
71103
72- yield order . persist ( ) ;
104+ var participants = group . participants . filter ( function ( participant ) {
105+ return ! participant . videoKey ;
106+ } ) ;
73107
74- log . debug ( "Order success: " + order . number ) ;
75- } ;
108+
109+ var videoKeys = yield VideoKey . find ( {
110+ tag : group . course . videoKeyTag ,
111+ used : false
112+ } ) . limit ( participants . length ) . exec ( ) ;
113+
114+ log . debug ( "Keys selected" , videoKeys && videoKeys . toArray ( ) ) ;
115+
116+ if ( ! videoKeys || videoKeys . length != participants . length ) {
117+ throw new Error ( "Недостаточно серийных номеров " + participants . length ) ;
118+ }
119+
120+ for ( var i = 0 ; i < participants . length ; i ++ ) {
121+ var participant = participants [ i ] ;
122+ participant . videoKey = videoKeys [ i ] . key ;
123+ videoKeys [ i ] . used = true ;
124+ }
125+
126+ yield group . persist ( ) ;
127+
128+ var jobs = videoKeys . map ( function ( videoKey ) {
129+ return videoKey . persist ( ) ;
130+ } ) ;
131+ yield jobs ;
132+ }
0 commit comments