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