Skip to content

Commit

Permalink
add sponsor plugin (mastodon#311)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mansh05 committed Dec 19, 2021
1 parent 0ab26bb commit cd6eed1
Show file tree
Hide file tree
Showing 43 changed files with 655 additions and 20 deletions.
1 change: 1 addition & 0 deletions Gemfile
Expand Up @@ -98,6 +98,7 @@ gem 'webauthn', '~> 3.0.0.alpha1'

gem 'ecko-plugins', path: 'gems/ecko-plugins'
gem 'ecko-plugins-stripe', path: 'gems/ecko-plugins-stripe'
gem 'ecko-plugins-sponsor', path: 'gems/ecko-plugins-sponsor'

gem 'json-ld'
gem 'json-ld-preloaded', '~> 3.1'
Expand Down
6 changes: 6 additions & 0 deletions Gemfile.lock
@@ -1,3 +1,8 @@
PATH
remote: gems/ecko-plugins-sponsor
specs:
ecko-plugins-sponsor (0.1.0)

PATH
remote: gems/ecko-plugins-stripe
specs:
Expand Down Expand Up @@ -754,6 +759,7 @@ DEPENDENCIES
doorkeeper (~> 5.5)
dotenv-rails (~> 2.7)
ecko-plugins!
ecko-plugins-sponsor!
ecko-plugins-stripe!
ed25519 (~> 1.2)
fabrication (~> 2.22)
Expand Down
17 changes: 17 additions & 0 deletions app/controllers/donations_controller.rb
@@ -0,0 +1,17 @@
# frozen_string_literal: true

class DonationsController < ApplicationController
layout 'public'

before_action :authenticate_user!

def donate
@packages = DonationPackage.visible
end

def payment_gateways
processed = Ecko::Plugins.sponsor.process(params[:package], current_account)

binding.pry
end
end
Expand Up @@ -27,6 +27,7 @@ const NavigationPanel = () => (

<a className='column-link column-link--transparent' href='/settings/preferences'><Icon className='column-link__icon' id='cog' fixedWidth /><FormattedMessage id='navigation_bar.preferences' defaultMessage='Preferences' /></a>
<a className='column-link column-link--transparent' href='/relationships'><Icon className='column-link__icon' id='users' fixedWidth /><FormattedMessage id='navigation_bar.follows_and_followers' defaultMessage='Follows and followers' /></a>
<a className='column-link column-link--transparent' href='/donate'><Icon className='column-link__icon' id='donations' fixedWidth /><FormattedMessage id='navigation_bar.donations' defaultMessage='Donate' /></a>

{showTrends && <div className='flex-spacer' />}
{showTrends && <TrendsContainer />}
Expand Down
60 changes: 60 additions & 0 deletions app/javascript/styles/mastodon/widgets.scss
Expand Up @@ -618,3 +618,63 @@ $fluid-breakpoint: $maximum-width + 20px;
border-bottom: 1px solid lighten($ui-base-color, 4%);
}
}

.donation {
.donation-title {
color: $classic-primary-color;
margin: 16px 0;
}

.donation-block {
&.grid-4 {
@media screen and (min-width: 739px) {
grid-template-columns: repeat(3, minmax(0, 1fr));
grid-gap: 5%;
}
a {
color: $classic-base-color;
text-decoration: none;
}
.card {
background: $classic-secondary-color;
text-align: center;
padding: 15%;
@media screen and (max-width: $no-gap-breakpoint) {
margin-bottom: 12px;
}
&:hover {
box-shadow: 0 2px 5px 0 $classic-secondary-color;
}
h3 {
font-size: 52px;
line-height: 52px;
margin-bottom: 12px;
color: $gold-star;
}
p {
line-height: 20px;
margin: 12px 0;
&.card-title {
font-size: 20px;
&.silver {
color: $classic-primary-color;
}
&.gold {
color: $classic-highlight-color;
}
&.platinum {
color: $success-green;
}
}
}
}
}
}
.donation-account {
margin: 5% 0 8%;
font-size: 20px;
line-height: 20px;
text-align: center;
color: $classic-primary-color;
}
}
8 changes: 8 additions & 0 deletions app/models/account.rb
Expand Up @@ -47,6 +47,8 @@
# devices_url :string
# sensitized_at :datetime
# suspension_origin :integer
# sponsor :integer default("free_tier")
# donation_amount :float default(0.0)
#

class Account < ApplicationRecord
Expand Down Expand Up @@ -81,6 +83,12 @@ class Account < ApplicationRecord

enum protocol: [:ostatus, :activitypub]
enum suspension_origin: [:local, :remote], _prefix: true
enum sponsor: {
free_tier: 0,
silver_tier: 100,
gold_tier: 1000,
platinum_tier: 2000,
}

validates :username, presence: true
validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? }
Expand Down
3 changes: 3 additions & 0 deletions app/models/concerns/account_associations.rb
Expand Up @@ -69,5 +69,8 @@ module AccountAssociations

# Account statuses cleanup policy
has_one :statuses_cleanup_policy, class_name: 'AccountStatusesCleanupPolicy', inverse_of: :account, dependent: :destroy

# Donations
has_many :donations, inverse_of: :account, dependent: :destroy
end
end
15 changes: 15 additions & 0 deletions app/models/donation.rb
@@ -0,0 +1,15 @@
# frozen_string_literal: true
# == Schema Information
#
# Table name: donations
#
# id :bigint(8) not null, primary key
# account_id :bigint(8) not null
# amount :float not null
# created_at :datetime not null
# updated_at :datetime not null
#

class Donation < ApplicationRecord
belongs_to :account, inverse_of: :donations
end
17 changes: 17 additions & 0 deletions app/models/donation_package.rb
@@ -0,0 +1,17 @@
# == Schema Information
#
# Table name: donation_packages
#
# id :bigint(8) not null, primary key
# amount :float
# currency :integer
# title :string
# description :text
# donation_reference :integer default(0)
# visible :boolean default(TRUE)
# created_at :datetime not null
# updated_at :datetime not null
#
class DonationPackage < ApplicationRecord
scope :visible, -> { where(visible: true) }
end
2 changes: 1 addition & 1 deletion app/models/registration_filter.rb
Expand Up @@ -5,7 +5,7 @@
#
# id :bigint(8) not null, primary key
# phrase :text default(""), not null
# type :integer default(0), not null
# type :integer default("text"), not null
# whole_word :boolean default(TRUE), not null
# created_at :datetime not null
# updated_at :datetime not null
Expand Down
10 changes: 10 additions & 0 deletions app/views/donations/donate.html.haml
@@ -0,0 +1,10 @@
.donation
.donation-title Please select one of the following to proceed dontion
.donation-block.grid-4
- @packages.each do |package|
= link_to(payment_gateways_path(package: package.id)) do
.card.box-widget
%h3= "#{package.amount.to_i}$"
%p{:class => "card-title #{package.title.downcase }" }= package.title
%p.card-description= package.description
.donation-account You have donated 0 amount.
11 changes: 8 additions & 3 deletions config/initializers/ecko_plugins.rb
@@ -1,6 +1,11 @@
# frozen_string_literal: true

Ecko::Plugins::Stripe.register(
stripe_api_key: ENV['STRIPE_API_KEY'],
currency: 'USD'
Ecko::Plugins::Stripe.register(stripe_api_key: ENV['STRIPE_API_KEY'], currency: 'USD')
Ecko::Plugins::Sponsor.register(
gateways: [
{
name: 'Stripe',
checkout: Ecko::Plugins.stripe.checkout_reference
}
]
)
3 changes: 3 additions & 0 deletions config/routes.rb
Expand Up @@ -22,6 +22,9 @@
end

stripe_callbacks 'stripe_callbacks'
resources :donations
get '/donate', to: 'donations#donate', as: :donate
get '/payment_gateways', to: 'donations#payment_gateways', as: :payment_gateways

get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
get '.well-known/nodeinfo', to: 'well_known/nodeinfo#index', as: :nodeinfo, defaults: { format: 'json' }
Expand Down
10 changes: 10 additions & 0 deletions db/migrate/20211219012410_create_donations.rb
@@ -0,0 +1,10 @@
class CreateDonations < ActiveRecord::Migration[6.1]
def change
create_table :donations do |t|
t.references :account, null: false
t.float :amount, null: false

t.timestamps
end
end
end
14 changes: 14 additions & 0 deletions db/migrate/20211219013704_create_donation_packages.rb
@@ -0,0 +1,14 @@
class CreateDonationPackages < ActiveRecord::Migration[6.1]
def change
create_table :donation_packages do |t|
t.float :amount
t.integer :currency
t.string :title
t.text :description
t.integer :donation_reference, default: 0
t.boolean :visible, default: true

t.timestamps
end
end
end
@@ -0,0 +1,6 @@
class AddSponsorAndDonationToAccounts < ActiveRecord::Migration[6.1]
def change
add_column :accounts, :sponsor, :integer, default: 0
add_column :accounts, :donation_amount, :float, default: 0
end
end
47 changes: 40 additions & 7 deletions db/schema.rb
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2021_11_30_104215) do
ActiveRecord::Schema.define(version: 2021_12_19_013911) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand Down Expand Up @@ -191,8 +191,10 @@
t.integer "avatar_storage_schema_version"
t.integer "header_storage_schema_version"
t.string "devices_url"
t.integer "suspension_origin"
t.datetime "sensitized_at"
t.integer "suspension_origin"
t.integer "sponsor", default: 0
t.float "donation_amount", default: 0.0
t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
t.index "lower((username)::text), COALESCE(lower((domain)::text), ''::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
Expand Down Expand Up @@ -375,6 +377,25 @@
t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true
end

create_table "donation_packages", force: :cascade do |t|
t.float "amount"
t.integer "currency"
t.string "title"
t.text "description"
t.integer "donation_reference", default: 0
t.boolean "visible", default: true
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end

create_table "donations", force: :cascade do |t|
t.bigint "account_id", null: false
t.float "amount", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["account_id"], name: "index_donations_on_account_id"
end

create_table "email_domain_blocks", force: :cascade do |t|
t.string "domain", default: "", null: false
t.datetime "created_at", null: false
Expand Down Expand Up @@ -485,12 +506,12 @@
end

create_table "ip_blocks", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "expires_at"
t.inet "ip", default: "0.0.0.0", null: false
t.integer "severity", default: 0, null: false
t.datetime "expires_at"
t.text "comment", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "list_accounts", force: :cascade do |t|
Expand Down Expand Up @@ -651,6 +672,18 @@
t.index ["key_id"], name: "index_one_time_keys_on_key_id"
end

create_table "payment_intentions", force: :cascade do |t|
t.string "code", null: false
t.string "reference", null: false
t.string "category", default: "stripe", null: false
t.string "payable_type"
t.bigint "payable_id"
t.jsonb "metadata", null: false
t.index ["code"], name: "index_payment_intentions_on_code", unique: true
t.index ["payable_type", "payable_id"], name: "index_payment_intentions_on_payable"
t.index ["reference"], name: "index_payment_intentions_on_reference"
end

create_table "pghero_space_stats", force: :cascade do |t|
t.text "database"
t.text "schema"
Expand Down Expand Up @@ -826,8 +859,8 @@
create_table "status_pins", force: :cascade do |t|
t.bigint "account_id", null: false
t.bigint "status_id", null: false
t.datetime "created_at", default: -> { "now()" }, null: false
t.datetime "updated_at", default: -> { "now()" }, null: false
t.datetime "created_at", default: -> { "CURRENT_TIMESTAMP" }, null: false
t.datetime "updated_at", default: -> { "CURRENT_TIMESTAMP" }, null: false
t.index ["account_id", "status_id"], name: "index_status_pins_on_account_id_and_status_id", unique: true
end

Expand Down
11 changes: 11 additions & 0 deletions gems/ecko-plugins-sponsor/.gitignore
@@ -0,0 +1,11 @@
/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/

# rspec failure tracking
.rspec_status
3 changes: 3 additions & 0 deletions gems/ecko-plugins-sponsor/.rspec
@@ -0,0 +1,3 @@
--format documentation
--color
--require spec_helper
10 changes: 10 additions & 0 deletions gems/ecko-plugins-sponsor/Gemfile
@@ -0,0 +1,10 @@
# frozen_string_literal: true

source "https://rubygems.org"

# Specify your gem's dependencies in ecko-plugins-sponsor.gemspec
gemspec

gem "rake", "~> 13.0"

gem "rspec", "~> 3.0"

0 comments on commit cd6eed1

Please sign in to comment.