package module // import ( // "context" // "sync" // "forge.cadoles.com/arcad/edge/pkg/app" // "forge.cadoles.com/arcad/edge/pkg/bus" // "forge.cadoles.com/arcad/edge/pkg/repository" // "github.com/dop251/goja" // "github.com/pkg/errors" // "gitlab.com/wpetit/goweb/logger" // ) // type AuthorizationModule struct { // appID app.ID // bus bus.Bus // backend *app.Server // admins sync.Map // } // func (m *AuthorizationModule) Name() string { // return "authorization" // } // func (m *AuthorizationModule) Export(export *goja.Object) { // if err := export.Set("isAdmin", m.isAdmin); err != nil { // panic(errors.Wrap(err, "could not set 'register' function")) // } // } // func (m *AuthorizationModule) isAdmin(call goja.FunctionCall) goja.Value { // userID := call.Argument(0).String() // if userID == "" { // panic(errors.New("first argument must be a user id")) // } // rawValue, exists := m.admins.Load(repository.UserID(userID)) // if !exists { // return m.backend.ToValue(false) // } // isAdmin, ok := rawValue.(bool) // if !ok { // return m.backend.ToValue(false) // } // return m.backend.ToValue(isAdmin) // } // func (m *AuthorizationModule) handleEvents() { // ctx := logger.With(context.Background(), logger.F("moduleAppID", m.appID)) // ns := AppMessageNamespace(m.appID) // userConnectedMessages, err := m.bus.Subscribe(ctx, ns, MessageTypeUserConnected) // if err != nil { // panic(errors.WithStack(err)) // } // userDisconnectedMessages, err := m.bus.Subscribe(ctx, ns, MessageTypeUserDisconnected) // if err != nil { // panic(errors.WithStack(err)) // } // defer func() { // m.bus.Unsubscribe(ctx, ns, MessageTypeUserConnected, userConnectedMessages) // m.bus.Unsubscribe(ctx, ns, MessageTypeUserDisconnected, userDisconnectedMessages) // }() // for { // select { // case msg := <-userConnectedMessages: // userConnectedMsg, ok := msg.(*MessageUserConnected) // if !ok { // continue // } // logger.Debug(ctx, "user connected", logger.F("msg", userConnectedMsg)) // m.admins.Store(userConnectedMsg.UserID, userConnectedMsg.IsAdmin) // case msg := <-userDisconnectedMessages: // userDisconnectedMsg, ok := msg.(*MessageUserDisconnected) // if !ok { // continue // } // logger.Debug(ctx, "user disconnected", logger.F("msg", userDisconnectedMsg)) // m.admins.Delete(userDisconnectedMsg.UserID) // } // } // } // func AuthorizationModuleFactory(b bus.Bus) app.ServerModuleFactory { // return func(appID app.ID, backend *app.Server) app.ServerModule { // mod := &AuthorizationModule{ // appID: appID, // bus: b, // backend: backend, // admins: sync.Map{}, // } // go mod.handleEvents() // return mod // } // }