Add feature flags #125
							
								
								
									
										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