@@ -2,8 +2,8 @@ defmodule Plausible.Billing do
2
2
use Plausible
3
3
use Plausible.Repo
4
4
require Plausible.Billing.Subscription.Status
5
+ alias Plausible.Auth
5
6
alias Plausible.Billing.Subscription
6
- alias Plausible.Auth.User
7
7
alias Plausible.Teams
8
8
9
9
def subscription_created ( params ) do
@@ -44,25 +44,15 @@ defmodule Plausible.Billing do
44
44
end
45
45
46
46
defp handle_subscription_created ( params ) do
47
- params =
48
- if present? ( params [ "passthrough" ] ) do
49
- format_params ( params )
50
- else
51
- user = Repo . get_by! ( User , email: params [ "email" ] )
52
- { :ok , team } = Plausible.Teams . get_or_create ( user )
53
-
54
- params
55
- |> Map . put ( "passthrough" , user . id )
56
- |> Map . put ( "team_id" , team . id )
57
- end
47
+ team = get_team! ( params )
58
48
59
49
subscription_params =
60
50
params
61
51
|> format_subscription ( )
62
52
|> add_last_bill_date ( params )
63
53
64
- % Subscription { }
65
- |> Subscription . changeset ( subscription_params )
54
+ team
55
+ |> Subscription . create_changeset ( subscription_params )
66
56
|> Repo . insert! ( )
67
57
|> after_subscription_update ( )
68
58
end
@@ -86,10 +76,7 @@ defmodule Plausible.Billing do
86
76
irrelevant? = params [ "old_status" ] == "paused" && params [ "status" ] == "past_due"
87
77
88
78
if subscription && not irrelevant? do
89
- params =
90
- params
91
- |> format_params ( )
92
- |> format_subscription ( )
79
+ params = format_subscription ( params )
93
80
94
81
subscription
95
82
|> Subscription . changeset ( params )
@@ -145,42 +132,66 @@ defmodule Plausible.Billing do
145
132
end
146
133
end
147
134
148
- defp format_params ( % { "passthrough" => passthrough } = params ) do
149
- case String . split ( to_string ( passthrough ) , ";" ) do
150
- [ user_id ] ->
151
- user = Repo . get! ( User , user_id )
152
- { :ok , team } = Plausible.Teams . get_or_create ( user )
153
- Map . put ( params , "team_id" , team . id )
135
+ defp get_team! ( % { "passthrough" => passthrough } ) do
136
+ case parse_passthrough! ( passthrough ) do
137
+ { :team_id , team_id } ->
138
+ Teams . get! ( team_id )
154
139
155
- [ "user:" <> user_id , "team:" <> team_id ] ->
156
- params
157
- |> Map . put ( "passthrough" , user_id )
158
- |> Map . put ( "team_id" , team_id )
140
+ { : user_id, user_id } ->
141
+ user = Repo . get! ( Auth.User , user_id )
142
+ { :ok , team } = Teams . get_or_create ( user )
143
+ team
159
144
end
160
145
end
161
146
162
- defp format_params ( params ) do
163
- params
147
+ defp get_team! ( _params ) do
148
+ raise "Missing passthrough"
149
+ end
150
+
151
+ defp parse_passthrough! ( passthrough ) do
152
+ { user_id , team_id } =
153
+ case String . split ( to_string ( passthrough ) , ";" ) do
154
+ [ "ee:true" , "user:" <> user_id , "team:" <> team_id ] ->
155
+ { user_id , team_id }
156
+
157
+ [ "ee:true" , "user:" <> user_id ] ->
158
+ { user_id , "0" }
159
+
160
+ # NOTE: legacy pattern, to be removed in a follow-up
161
+ [ "user:" <> user_id , "team:" <> team_id ] ->
162
+ { user_id , team_id }
163
+
164
+ # NOTE: legacy pattern, to be removed in a follow-up
165
+ [ user_id ] ->
166
+ { user_id , "0" }
167
+
168
+ _ ->
169
+ raise "Invalid passthrough sent via Paddle: #{ inspect ( passthrough ) } "
170
+ end
171
+
172
+ case { Integer . parse ( user_id ) , Integer . parse ( team_id ) } do
173
+ { { user_id , "" } , { 0 , "" } } when user_id > 0 ->
174
+ { :user_id , user_id }
175
+
176
+ { { _user_id , "" } , { team_id , "" } } when team_id > 0 ->
177
+ { :team_id , team_id }
178
+
179
+ _ ->
180
+ raise "Invalid passthrough sent via Paddle: #{ inspect ( passthrough ) } "
181
+ end
164
182
end
165
183
166
184
defp format_subscription ( params ) do
167
- subscription_params = % {
185
+ % {
168
186
paddle_subscription_id: params [ "subscription_id" ] ,
169
187
paddle_plan_id: params [ "subscription_plan_id" ] ,
170
188
cancel_url: params [ "cancel_url" ] ,
171
189
update_url: params [ "update_url" ] ,
172
- user_id: params [ "passthrough" ] ,
173
190
status: params [ "status" ] ,
174
191
next_bill_date: params [ "next_bill_date" ] ,
175
192
next_bill_amount: params [ "unit_price" ] || params [ "new_unit_price" ] ,
176
193
currency_code: params [ "currency" ]
177
194
}
178
-
179
- if team_id = params [ "team_id" ] do
180
- Map . put ( subscription_params , :team_id , team_id )
181
- else
182
- subscription_params
183
- end
184
195
end
185
196
186
197
defp add_last_bill_date ( subscription_params , paddle_params ) do
@@ -193,10 +204,6 @@ defmodule Plausible.Billing do
193
204
end
194
205
end
195
206
196
- defp present? ( "" ) , do: false
197
- defp present? ( nil ) , do: false
198
- defp present? ( _ ) , do: true
199
-
200
207
@ spec format_price ( Money . t ( ) ) :: String . t ( )
201
208
def format_price ( money ) do
202
209
Money . to_string! ( money , fractional_digits: 2 , no_fraction_if_integer: true )
0 commit comments