delete subscriptions in admin

This commit is contained in:
Rimian Perkins 2019-11-14 10:51:04 +11:00
parent 0f17acc47e
commit 6590d8051c
7 changed files with 66 additions and 6 deletions

View File

@ -16,6 +16,18 @@ module DiscoursePatrons
return render_json_error e.message return render_json_error e.message
end end
end end
def destroy
begin
subscription = ::Stripe::Subscription.delete(params[:id])
render_json_dump subscription
rescue ::Stripe::InvalidRequestError => e
return render_json_error e.message
end
end
end end
end end
end end

View File

@ -2,6 +2,11 @@ import computed from "ember-addons/ember-computed-decorators";
import { ajax } from "discourse/lib/ajax"; import { ajax } from "discourse/lib/ajax";
const AdminSubscription = Discourse.Model.extend({ const AdminSubscription = Discourse.Model.extend({
@computed("status")
canceled(status) {
return status === "canceled";
},
@computed("metadata") @computed("metadata")
metadataUserExists(metadata) { metadataUserExists(metadata) {
return metadata.user_id && metadata.username; return metadata.user_id && metadata.username;
@ -12,6 +17,12 @@ const AdminSubscription = Discourse.Model.extend({
return Discourse.getURL( return Discourse.getURL(
`/admin/users/${metadata.user_id}/${metadata.username}` `/admin/users/${metadata.user_id}/${metadata.username}`
); );
},
destroy() {
return ajax(`/patrons/admin/subscriptions/${this.id}`, {
method: "delete"
}).then(result => AdminSubscription.create(result));
} }
}); });

View File

@ -3,5 +3,27 @@ import AdminSubscription from "discourse/plugins/discourse-patrons/discourse/mod
export default Discourse.Route.extend({ export default Discourse.Route.extend({
model() { model() {
return AdminSubscription.find(); return AdminSubscription.find();
},
actions: {
cancelSubscription(subscription) {
bootbox.confirm(
I18n.t(
"discourse_patrons.user.subscriptions.operations.destroy.confirm"
),
I18n.t("no_value"),
I18n.t("yes_value"),
confirmed => {
if (confirmed) {
subscription
.destroy()
.then(result => subscription.set("status", result.status))
.catch(data =>
bootbox.alert(data.jqXHR.responseJSON.errors.join("\n"))
);
}
}
);
}
} }
}); });

View File

@ -7,6 +7,7 @@
<th>{{i18n 'discourse_patrons.admin.subscriptions.subscription.plan'}}</th> <th>{{i18n 'discourse_patrons.admin.subscriptions.subscription.plan'}}</th>
<th>{{i18n 'discourse_patrons.admin.subscriptions.subscription.status'}}</th> <th>{{i18n 'discourse_patrons.admin.subscriptions.subscription.status'}}</th>
<th class="td-right">{{i18n 'discourse_patrons.admin.subscriptions.subscription.created_at'}}</th> <th class="td-right">{{i18n 'discourse_patrons.admin.subscriptions.subscription.created_at'}}</th>
<th></th>
</tr> </tr>
</thead> </thead>
{{#each model as |subscription|}} {{#each model as |subscription|}}
@ -22,6 +23,7 @@
<td>{{subscription.plan.id}}</td> <td>{{subscription.plan.id}}</td>
<td>{{subscription.status}}</td> <td>{{subscription.status}}</td>
<td class="td-right">{{format-unix-date subscription.created}}</td> <td class="td-right">{{format-unix-date subscription.created}}</td>
<td class="td-right">{{d-button disabled=subscription.canceled label="cancel" action=(route-action "cancelSubscription" subscription) icon="times"}}</td>
</tr> </tr>
{{/each}} {{/each}}
</table> </table>

View File

@ -8,7 +8,7 @@ DiscoursePatrons::Engine.routes.draw do
namespace :admin do namespace :admin do
resources :plans resources :plans
resources :subscriptions, only: [:index] resources :subscriptions, only: [:index, :destroy]
resources :products resources :products
end end

View File

@ -27,7 +27,6 @@ add_admin_route 'discourse_patrons.title', 'discourse-patrons.products'
Discourse::Application.routes.append do Discourse::Application.routes.append do
get '/admin/plugins/discourse-patrons' => 'admin/plugins#index' get '/admin/plugins/discourse-patrons' => 'admin/plugins#index'
get '/admin/plugins/discourse-patrons/dashboard' => 'admin/plugins#index'
get '/admin/plugins/discourse-patrons/products' => 'admin/plugins#index' get '/admin/plugins/discourse-patrons/products' => 'admin/plugins#index'
get '/admin/plugins/discourse-patrons/products/:product_id' => 'admin/plugins#index' get '/admin/plugins/discourse-patrons/products/:product_id' => 'admin/plugins#index'
get '/admin/plugins/discourse-patrons/products/:product_id/plans' => 'admin/plugins#index' get '/admin/plugins/discourse-patrons/products/:product_id/plans' => 'admin/plugins#index'

View File

@ -14,6 +14,11 @@ module DiscoursePatrons
get "/patrons/admin/subscriptions.json" get "/patrons/admin/subscriptions.json"
expect(response.status).to eq(403) expect(response.status).to eq(403)
end end
it "does not destroy a subscription" do
::Stripe::Subscription.expects(:delete).never
patch "/patrons/admin/subscriptions/sub_12345.json"
end
end end
context 'authenticated' do context 'authenticated' do
@ -21,11 +26,20 @@ module DiscoursePatrons
before { sign_in(admin) } before { sign_in(admin) }
it "gets the empty subscriptions" do describe "index" do
it "gets the subscriptions" do
::Stripe::Subscription.expects(:list) ::Stripe::Subscription.expects(:list)
get "/patrons/admin/subscriptions.json" get "/patrons/admin/subscriptions.json"
expect(response.status).to eq(200) expect(response.status).to eq(200)
end end
end end
describe "destroy" do
it "deletes a subscription" do
::Stripe::Subscription.expects(:delete).with('sub_12345')
delete "/patrons/admin/subscriptions/sub_12345.json"
end
end
end
end end
end end