diff --git a/app/controllers/api/v1/admin/tenants_controller.rb b/app/controllers/api/v1/admin/tenants_controller.rb index fb4399e8ceddd81c7d17e8edd071020a3f6cdd2d..b14634abe3b95d15d85f0c4cf5338b0d7865d202 100644 --- a/app/controllers/api/v1/admin/tenants_controller.rb +++ b/app/controllers/api/v1/admin/tenants_controller.rb @@ -41,10 +41,7 @@ module Api tenant = Tenant.new(name:, client_secret: tenant_params[:client_secret]) if tenant.save - create_roles(tenant.name) - create_site_settings(tenant.name) - create_rooms_configs_options(tenant.name) - create_role_permissions(tenant.name) + TenantSetup.new(name).call render_data status: :created else render_error errors: tenant.errors.to_a, status: :bad_request @@ -67,95 +64,6 @@ module Api def cache; end - private - - def create_roles(provider) - Role.create! [ - { name: 'Administrator', provider: }, - { name: 'User', provider: }, - { name: 'Guest', provider: } - ] - end - - def create_site_settings(provider) - SiteSetting.create! [ - { setting: Setting.find_by(name: 'PrimaryColor'), value: '#467fcf', provider: }, - { setting: Setting.find_by(name: 'PrimaryColorLight'), value: '#e8eff9', provider: }, - { setting: Setting.find_by(name: 'PrimaryColorDark'), value: '#316cbe', provider: }, - { setting: Setting.find_by(name: 'BrandingImage'), - value: ActionController::Base.helpers.image_path('bbb_logo.png'), - provider: }, - { setting: Setting.find_by(name: 'Terms'), value: '', provider: }, - { setting: Setting.find_by(name: 'PrivacyPolicy'), value: '', provider: }, - { setting: Setting.find_by(name: 'RegistrationMethod'), value: SiteSetting::REGISTRATION_METHODS[:open], provider: }, - { setting: Setting.find_by(name: 'ShareRooms'), value: 'true', provider: }, - { setting: Setting.find_by(name: 'PreuploadPresentation'), value: 'true', provider: }, - { setting: Setting.find_by(name: 'RoleMapping'), value: '', provider: }, - { setting: Setting.find_by(name: 'DefaultRole'), provider:, value: 'User' } - ] - end - - def create_rooms_configs_options(provider) - RoomsConfiguration.create! [ - { meeting_option: MeetingOption.find_by(name: 'record'), value: 'default_enabled', provider: }, - { meeting_option: MeetingOption.find_by(name: 'muteOnStart'), value: 'optional', provider: }, - { meeting_option: MeetingOption.find_by(name: 'guestPolicy'), value: 'optional', provider: }, - { meeting_option: MeetingOption.find_by(name: 'glAnyoneCanStart'), value: 'optional', provider: }, - { meeting_option: MeetingOption.find_by(name: 'glAnyoneJoinAsModerator'), value: 'optional', provider: }, - { meeting_option: MeetingOption.find_by(name: 'glRequireAuthentication'), value: 'optional', provider: }, - { meeting_option: MeetingOption.find_by(name: 'glViewerAccessCode'), value: 'optional', provider: }, - { meeting_option: MeetingOption.find_by(name: 'glModeratorAccessCode'), value: 'optional', provider: } - ] - end - - def create_role_permissions(provider) - admin = Role.find_by(name: 'Administrator', provider:) - user = Role.find_by(name: 'User', provider:) - guest = Role.find_by(name: 'Guest', provider:) - - create_room = Permission.find_by(name: 'CreateRoom') - manage_users = Permission.find_by(name: 'ManageUsers') - manage_rooms = Permission.find_by(name: 'ManageRooms') - manage_recordings = Permission.find_by(name: 'ManageRecordings') - manage_site_settings = Permission.find_by(name: 'ManageSiteSettings') - manage_roles = Permission.find_by(name: 'ManageRoles') - shared_list = Permission.find_by(name: 'SharedList') - can_record = Permission.find_by(name: 'CanRecord') - room_limit = Permission.find_by(name: 'RoomLimit') - - RolePermission.create! [ - { role: admin, permission: create_room, value: 'true' }, - { role: admin, permission: manage_users, value: 'true' }, - { role: admin, permission: manage_rooms, value: 'true' }, - { role: admin, permission: manage_recordings, value: 'true' }, - { role: admin, permission: manage_site_settings, value: 'true' }, - { role: admin, permission: manage_roles, value: 'true' }, - { role: admin, permission: shared_list, value: 'true' }, - { role: admin, permission: can_record, value: 'true' }, - { role: admin, permission: room_limit, value: '100' }, - - { role: user, permission: create_room, value: 'true' }, - { role: user, permission: manage_users, value: 'false' }, - { role: user, permission: manage_rooms, value: 'false' }, - { role: user, permission: manage_recordings, value: 'false' }, - { role: user, permission: manage_site_settings, value: 'false' }, - { role: user, permission: manage_roles, value: 'false' }, - { role: user, permission: shared_list, value: 'true' }, - { role: user, permission: can_record, value: 'true' }, - { role: user, permission: room_limit, value: '100' }, - - { role: guest, permission: create_room, value: 'false' }, - { role: guest, permission: manage_users, value: 'false' }, - { role: guest, permission: manage_rooms, value: 'false' }, - { role: guest, permission: manage_recordings, value: 'false' }, - { role: guest, permission: manage_site_settings, value: 'false' }, - { role: guest, permission: manage_roles, value: 'false' }, - { role: guest, permission: shared_list, value: 'true' }, - { role: guest, permission: can_record, value: 'true' }, - { role: guest, permission: room_limit, value: '100' } - ] - end - def delete_roles(provider) Role.where(provider:).destroy_all end diff --git a/app/services/tenant_setup.rb b/app/services/tenant_setup.rb new file mode 100644 index 0000000000000000000000000000000000000000..d1754bae91e513c8363d2a074139045df0f8b036 --- /dev/null +++ b/app/services/tenant_setup.rb @@ -0,0 +1,119 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with Greenlight; if not, see <http://www.gnu.org/licenses/>. + +# frozen_string_literal: true + +# Creates the roles, site settings, and room config options for the given tenant. +class TenantSetup + def initialize(provider) + @provider = provider + end + + def call + create_roles + create_site_settings + create_rooms_configs_options + create_role_permissions + end + + def create_roles + Role.create! [ + { name: 'Administrator', provider: @provider }, + { name: 'User', provider: @provider }, + { name: 'Guest', provider: @provider } + ] + end + + def create_site_settings + SiteSetting.create! [ + { setting: Setting.find_by(name: 'PrimaryColor'), value: '#467fcf', provider: @provider }, + { setting: Setting.find_by(name: 'PrimaryColorLight'), value: '#e8eff9', provider: @provider }, + { setting: Setting.find_by(name: 'PrimaryColorDark'), value: '#316cbe', provider: @provider }, + { setting: Setting.find_by(name: 'BrandingImage'), + value: ActionController::Base.helpers.image_path('bbb_logo.png'), + provider: @provider }, + { setting: Setting.find_by(name: 'Terms'), value: '', provider: @provider }, + { setting: Setting.find_by(name: 'PrivacyPolicy'), value: '', provider: @provider }, + { setting: Setting.find_by(name: 'RegistrationMethod'), value: SiteSetting::REGISTRATION_METHODS[:open], + provider: @provider }, + { setting: Setting.find_by(name: 'ShareRooms'), value: 'true', provider: @provider }, + { setting: Setting.find_by(name: 'PreuploadPresentation'), value: 'true', provider: @provider }, + { setting: Setting.find_by(name: 'RoleMapping'), value: '', provider: @provider }, + { setting: Setting.find_by(name: 'DefaultRole'), provider: @provider, value: 'User' } + ] + end + + def create_rooms_configs_options + RoomsConfiguration.create! [ + { meeting_option: MeetingOption.find_by(name: 'record'), value: 'default_enabled', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'muteOnStart'), value: 'optional', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'guestPolicy'), value: 'optional', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'glAnyoneCanStart'), value: 'optional', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'glAnyoneJoinAsModerator'), value: 'optional', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'glRequireAuthentication'), value: 'optional', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'glViewerAccessCode'), value: 'optional', provider: @provider }, + { meeting_option: MeetingOption.find_by(name: 'glModeratorAccessCode'), value: 'optional', provider: @provider } + ] + end + + def create_role_permissions + admin = Role.find_by(name: 'Administrator', provider: @provider) + user = Role.find_by(name: 'User', provider: @provider) + guest = Role.find_by(name: 'Guest', provider: @provider) + + create_room = Permission.find_by(name: 'CreateRoom') + manage_users = Permission.find_by(name: 'ManageUsers') + manage_rooms = Permission.find_by(name: 'ManageRooms') + manage_recordings = Permission.find_by(name: 'ManageRecordings') + manage_site_settings = Permission.find_by(name: 'ManageSiteSettings') + manage_roles = Permission.find_by(name: 'ManageRoles') + shared_list = Permission.find_by(name: 'SharedList') + can_record = Permission.find_by(name: 'CanRecord') + room_limit = Permission.find_by(name: 'RoomLimit') + + RolePermission.create! [ + { role: admin, permission: create_room, value: 'true' }, + { role: admin, permission: manage_users, value: 'true' }, + { role: admin, permission: manage_rooms, value: 'true' }, + { role: admin, permission: manage_recordings, value: 'true' }, + { role: admin, permission: manage_site_settings, value: 'true' }, + { role: admin, permission: manage_roles, value: 'true' }, + { role: admin, permission: shared_list, value: 'true' }, + { role: admin, permission: can_record, value: 'true' }, + { role: admin, permission: room_limit, value: '100' }, + + { role: user, permission: create_room, value: 'true' }, + { role: user, permission: manage_users, value: 'false' }, + { role: user, permission: manage_rooms, value: 'false' }, + { role: user, permission: manage_recordings, value: 'false' }, + { role: user, permission: manage_site_settings, value: 'false' }, + { role: user, permission: manage_roles, value: 'false' }, + { role: user, permission: shared_list, value: 'true' }, + { role: user, permission: can_record, value: 'true' }, + { role: user, permission: room_limit, value: '100' }, + + { role: guest, permission: create_room, value: 'false' }, + { role: guest, permission: manage_users, value: 'false' }, + { role: guest, permission: manage_rooms, value: 'false' }, + { role: guest, permission: manage_recordings, value: 'false' }, + { role: guest, permission: manage_site_settings, value: 'false' }, + { role: guest, permission: manage_roles, value: 'false' }, + { role: guest, permission: shared_list, value: 'true' }, + { role: guest, permission: can_record, value: 'true' }, + { role: guest, permission: room_limit, value: '100' } + ] + end +end diff --git a/lib/tasks/add_default_tenant.rake b/lib/tasks/add_default_tenant.rake new file mode 100644 index 0000000000000000000000000000000000000000..f9c83c5e0105c85ca84f41960e666d22ad0b7c6f --- /dev/null +++ b/lib/tasks/add_default_tenant.rake @@ -0,0 +1,33 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with Greenlight; if not, see <http://www.gnu.org/licenses/>. + +# frozen_string_literal: true + +require_relative 'task_helpers' + +desc 'Add default tenant' +task :add_default_tenant, [:secret] => :environment do |_t, args| + err 'Missing secret' unless args.secret + + tenant = Tenant.new(name: 'bn', client_secret: args.secret) + + if tenant.save + TenantSetup.new('bn').call + success 'Tenant created successfully.' + else + err "Tenant not created. Errors: #{tenant.errors.to_a}" + end +end