Merge pull request 'Add feature flags' (#125) from feature/124-feature_flags into master
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			Reviewed-on: #125 Reviewed-by: greg <greg@noreply.kosmos.org>
This commit is contained in:
		
						commit
						87720ef285
					
				
							
								
								
									
										3
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Gemfile
									
									
									
									
									
								
							@ -40,6 +40,9 @@ gem 'net-ldap'
 | 
				
			|||||||
gem "rqrcode", "~> 2.0"
 | 
					gem "rqrcode", "~> 2.0"
 | 
				
			||||||
gem 'rails-settings-cached', '~> 2.8.3'
 | 
					gem 'rails-settings-cached', '~> 2.8.3'
 | 
				
			||||||
gem 'pagy', '~> 6.0', '>= 6.0.2'
 | 
					gem 'pagy', '~> 6.0', '>= 6.0.2'
 | 
				
			||||||
 | 
					gem 'flipper'
 | 
				
			||||||
 | 
					gem 'flipper-active_record'
 | 
				
			||||||
 | 
					gem 'flipper-ui'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# HTTP requests
 | 
					# HTTP requests
 | 
				
			||||||
gem 'faraday'
 | 
					gem 'faraday'
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								Gemfile.lock
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								Gemfile.lock
									
									
									
									
									
								
							@ -128,6 +128,17 @@ GEM
 | 
				
			|||||||
      ruby2_keywords (>= 0.0.4)
 | 
					      ruby2_keywords (>= 0.0.4)
 | 
				
			||||||
    faraday-net_http (3.0.2)
 | 
					    faraday-net_http (3.0.2)
 | 
				
			||||||
    ffi (1.15.5)
 | 
					    ffi (1.15.5)
 | 
				
			||||||
 | 
					    flipper (0.28.0)
 | 
				
			||||||
 | 
					      concurrent-ruby (< 2)
 | 
				
			||||||
 | 
					    flipper-active_record (0.28.0)
 | 
				
			||||||
 | 
					      activerecord (>= 4.2, < 8)
 | 
				
			||||||
 | 
					      flipper (~> 0.28.0)
 | 
				
			||||||
 | 
					    flipper-ui (0.28.0)
 | 
				
			||||||
 | 
					      erubi (>= 1.0.0, < 2.0.0)
 | 
				
			||||||
 | 
					      flipper (~> 0.28.0)
 | 
				
			||||||
 | 
					      rack (>= 1.4, < 3)
 | 
				
			||||||
 | 
					      rack-protection (>= 1.5.3, <= 4.0.0)
 | 
				
			||||||
 | 
					      sanitize (< 7)
 | 
				
			||||||
    fugit (1.7.2)
 | 
					    fugit (1.7.2)
 | 
				
			||||||
      et-orbi (~> 1, >= 1.2.7)
 | 
					      et-orbi (~> 1, >= 1.2.7)
 | 
				
			||||||
      raabro (~> 1.4)
 | 
					      raabro (~> 1.4)
 | 
				
			||||||
@ -199,6 +210,8 @@ GEM
 | 
				
			|||||||
    raabro (1.4.0)
 | 
					    raabro (1.4.0)
 | 
				
			||||||
    racc (1.6.0)
 | 
					    racc (1.6.0)
 | 
				
			||||||
    rack (2.2.4)
 | 
					    rack (2.2.4)
 | 
				
			||||||
 | 
					    rack-protection (3.0.6)
 | 
				
			||||||
 | 
					      rack
 | 
				
			||||||
    rack-test (2.0.2)
 | 
					    rack-test (2.0.2)
 | 
				
			||||||
      rack (>= 1.3)
 | 
					      rack (>= 1.3)
 | 
				
			||||||
    rails (7.0.4)
 | 
					    rails (7.0.4)
 | 
				
			||||||
@ -283,6 +296,9 @@ GEM
 | 
				
			|||||||
    ruby2_keywords (0.0.5)
 | 
					    ruby2_keywords (0.0.5)
 | 
				
			||||||
    rufus-scheduler (3.8.2)
 | 
					    rufus-scheduler (3.8.2)
 | 
				
			||||||
      fugit (~> 1.1, >= 1.1.6)
 | 
					      fugit (~> 1.1, >= 1.1.6)
 | 
				
			||||||
 | 
					    sanitize (6.0.1)
 | 
				
			||||||
 | 
					      crass (~> 1.0.2)
 | 
				
			||||||
 | 
					      nokogiri (>= 1.12.0)
 | 
				
			||||||
    sentry-rails (5.8.0)
 | 
					    sentry-rails (5.8.0)
 | 
				
			||||||
      railties (>= 5.0)
 | 
					      railties (>= 5.0)
 | 
				
			||||||
      sentry-ruby (~> 5.8.0)
 | 
					      sentry-ruby (~> 5.8.0)
 | 
				
			||||||
@ -374,6 +390,9 @@ DEPENDENCIES
 | 
				
			|||||||
  factory_bot_rails
 | 
					  factory_bot_rails
 | 
				
			||||||
  faker
 | 
					  faker
 | 
				
			||||||
  faraday
 | 
					  faraday
 | 
				
			||||||
 | 
					  flipper
 | 
				
			||||||
 | 
					  flipper-active_record
 | 
				
			||||||
 | 
					  flipper-ui
 | 
				
			||||||
  importmap-rails
 | 
					  importmap-rails
 | 
				
			||||||
  jbuilder (~> 2.7)
 | 
					  jbuilder (~> 2.7)
 | 
				
			||||||
  letter_opener
 | 
					  letter_opener
 | 
				
			||||||
 | 
				
			|||||||
@ -114,6 +114,10 @@ command:
 | 
				
			|||||||
* [Sidekiq](https://github.com/mperham/sidekiq/wiki/)
 | 
					* [Sidekiq](https://github.com/mperham/sidekiq/wiki/)
 | 
				
			||||||
* [ActiveJob](https://github.com/mperham/sidekiq/wiki/Active-Job)
 | 
					* [ActiveJob](https://github.com/mperham/sidekiq/wiki/Active-Job)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Feature Flags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [Flipper](https://www.flippercloud.io/docs/get-started/self-hosted)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
 | 
					[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										30
									
								
								app/controllers/services/remotestorage_controller.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								app/controllers/services/remotestorage_controller.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					class Services::RemotestorageController < ApplicationController
 | 
				
			||||||
 | 
					  before_action :require_user_signed_in
 | 
				
			||||||
 | 
					  before_action :require_service_enabled
 | 
				
			||||||
 | 
					  before_action :require_feature_enabled
 | 
				
			||||||
 | 
					  before_action :set_current_section
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def dashboard
 | 
				
			||||||
 | 
					    # unless current_user.services_enabled.include?(:remotestorage)
 | 
				
			||||||
 | 
					    #   redirect_to service_remotestorage_info_path
 | 
				
			||||||
 | 
					    # end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def require_feature_enabled
 | 
				
			||||||
 | 
					      unless Flipper.enabled?(:remotestorage, current_user)
 | 
				
			||||||
 | 
					        http_status :forbidden
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def require_service_enabled
 | 
				
			||||||
 | 
					      unless Setting.remotestorage_enabled?
 | 
				
			||||||
 | 
					        http_status :not_found
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_current_section
 | 
				
			||||||
 | 
					      @current_section = :services
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -6,6 +6,10 @@
 | 
				
			|||||||
      <h3>Account</h3>
 | 
					      <h3>Account</h3>
 | 
				
			||||||
      <table class="divided">
 | 
					      <table class="divided">
 | 
				
			||||||
        <tbody>
 | 
					        <tbody>
 | 
				
			||||||
 | 
					          <tr>
 | 
				
			||||||
 | 
					            <th>ID</th>
 | 
				
			||||||
 | 
					            <td><%= @user.id %></td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
          <tr>
 | 
					          <tr>
 | 
				
			||||||
            <th>Created at</th>
 | 
					            <th>Created at</th>
 | 
				
			||||||
            <td><%= @user.created_at.strftime("%Y-%m-%d (%H:%M UTC)") %></td>
 | 
					            <td><%= @user.created_at.strftime("%Y-%m-%d (%H:%M UTC)") %></td>
 | 
				
			||||||
 | 
				
			|||||||
@ -73,6 +73,17 @@
 | 
				
			|||||||
          </p>
 | 
					          </p>
 | 
				
			||||||
        <% end %>
 | 
					        <% end %>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					      <% if Setting.remotestorage_enabled? && Flipper.enabled?(:remotestorage, current_user) %>
 | 
				
			||||||
 | 
					        <div class="border border-gray-300 rounded-md hover:border-gray-400">
 | 
				
			||||||
 | 
					          <%= link_to services_storage_path,
 | 
				
			||||||
 | 
					                class: "block h-full px-6 py-6 rounded-md" do %>
 | 
				
			||||||
 | 
					            <h3 class="mb-3.5">Storage</h3>
 | 
				
			||||||
 | 
					            <p class="text-gray-600">
 | 
				
			||||||
 | 
					              Sync your data between apps and devices
 | 
				
			||||||
 | 
					            </p>
 | 
				
			||||||
 | 
					          <% end %>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      <% end %>
 | 
				
			||||||
      <!-- <div class="border border-gray-300 rounded-md hover:border-gray-400 -->
 | 
					      <!-- <div class="border border-gray-300 rounded-md hover:border-gray-400 -->
 | 
				
			||||||
      <!--             bg-[length:80%] bg-[right_top_-30px] bg-no-repeat -->
 | 
					      <!--             bg-[length:80%] bg-[right_top_-30px] bg-no-repeat -->
 | 
				
			||||||
      <!--             bg-[url(/img/logos/icon_mastodon.svg)]"> -->
 | 
					      <!--             bg-[url(/img/logos/icon_mastodon.svg)]"> -->
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										7
									
								
								app/views/services/remotestorage/dashboard.html.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/views/services/remotestorage/dashboard.html.erb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					<%= render HeaderComponent.new(title: "Storage") %>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<%= render MainSimpleComponent.new do %>
 | 
				
			||||||
 | 
					  <section>
 | 
				
			||||||
 | 
					    <h3>Feature enabled</h3>
 | 
				
			||||||
 | 
					  </section>
 | 
				
			||||||
 | 
					<% end %>
 | 
				
			||||||
@ -19,6 +19,8 @@ Rails.application.routes.draw do
 | 
				
			|||||||
  resources :invitations, only: ['index', 'show', 'create', 'destroy']
 | 
					  resources :invitations, only: ['index', 'show', 'create', 'destroy']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  namespace :services do
 | 
					  namespace :services do
 | 
				
			||||||
 | 
					    get 'storage', to: 'remotestorage#dashboard'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resources :lightning, only: [:index] do
 | 
					    resources :lightning, only: [:index] do
 | 
				
			||||||
      collection do
 | 
					      collection do
 | 
				
			||||||
        get 'transactions'
 | 
					        get 'transactions'
 | 
				
			||||||
@ -62,6 +64,7 @@ Rails.application.routes.draw do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  authenticate :user, ->(user) { user.is_admin? } do
 | 
					  authenticate :user, ->(user) { user.is_admin? } do
 | 
				
			||||||
    mount Sidekiq::Web => '/sidekiq'
 | 
					    mount Sidekiq::Web => '/sidekiq'
 | 
				
			||||||
 | 
					    mount Flipper::UI.app(Flipper) => '/flipper'
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Letter Opener (open "sent" emails in dev and staging)
 | 
					  # Letter Opener (open "sent" emails in dev and staging)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										22
									
								
								db/migrate/20230523120753_create_flipper_tables.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								db/migrate/20230523120753_create_flipper_tables.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					class CreateFlipperTables < ActiveRecord::Migration[7.0]
 | 
				
			||||||
 | 
					  def self.up
 | 
				
			||||||
 | 
					    create_table :flipper_features do |t|
 | 
				
			||||||
 | 
					      t.string :key, null: false
 | 
				
			||||||
 | 
					      t.timestamps null: false
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    add_index :flipper_features, :key, unique: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    create_table :flipper_gates do |t|
 | 
				
			||||||
 | 
					      t.string :feature_key, null: false
 | 
				
			||||||
 | 
					      t.string :key, null: false
 | 
				
			||||||
 | 
					      t.string :value
 | 
				
			||||||
 | 
					      t.timestamps null: false
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    add_index :flipper_gates, [:feature_key, :key, :value], unique: true
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def self.down
 | 
				
			||||||
 | 
					    drop_table :flipper_gates
 | 
				
			||||||
 | 
					    drop_table :flipper_features
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										18
									
								
								db/schema.rb
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								db/schema.rb
									
									
									
									
									
								
							@ -10,7 +10,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# It's strongly recommended that you check this file into your version control system.
 | 
					# It's strongly recommended that you check this file into your version control system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ActiveRecord::Schema[7.0].define(version: 2023_04_03_135149) do
 | 
					ActiveRecord::Schema[7.0].define(version: 2023_05_23_120753) do
 | 
				
			||||||
  create_table "donations", force: :cascade do |t|
 | 
					  create_table "donations", force: :cascade do |t|
 | 
				
			||||||
    t.integer "user_id"
 | 
					    t.integer "user_id"
 | 
				
			||||||
    t.integer "amount_sats"
 | 
					    t.integer "amount_sats"
 | 
				
			||||||
@ -23,6 +23,22 @@ ActiveRecord::Schema[7.0].define(version: 2023_04_03_135149) do
 | 
				
			|||||||
    t.index ["user_id"], name: "index_donations_on_user_id"
 | 
					    t.index ["user_id"], name: "index_donations_on_user_id"
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  create_table "flipper_features", force: :cascade do |t|
 | 
				
			||||||
 | 
					    t.string "key", null: false
 | 
				
			||||||
 | 
					    t.datetime "created_at", null: false
 | 
				
			||||||
 | 
					    t.datetime "updated_at", null: false
 | 
				
			||||||
 | 
					    t.index ["key"], name: "index_flipper_features_on_key", unique: true
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  create_table "flipper_gates", force: :cascade do |t|
 | 
				
			||||||
 | 
					    t.string "feature_key", null: false
 | 
				
			||||||
 | 
					    t.string "key", null: false
 | 
				
			||||||
 | 
					    t.string "value"
 | 
				
			||||||
 | 
					    t.datetime "created_at", null: false
 | 
				
			||||||
 | 
					    t.datetime "updated_at", null: false
 | 
				
			||||||
 | 
					    t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  create_table "invitations", force: :cascade do |t|
 | 
					  create_table "invitations", force: :cascade do |t|
 | 
				
			||||||
    t.string "token"
 | 
					    t.string "token"
 | 
				
			||||||
    t.integer "user_id"
 | 
					    t.integer "user_id"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user