Skip to content

Commit e4579a9

Browse files
authored
♻️ Feedback on payments plugin and service (#4763)
1 parent 0bf85e1 commit e4579a9

File tree

17 files changed

+258
-102
lines changed

17 files changed

+258
-102
lines changed

api/specs/web-server/_wallets.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ async def update_wallet(wallet_id: WalletID, body: PutWalletBodyParams):
7272
@router.post(
7373
"/wallets/{wallet_id}/payments",
7474
response_model=Envelope[WalletPaymentCreated],
75+
response_description="Successfully initialized",
76+
status_code=status.HTTP_202_ACCEPTED,
7577
)
7678
async def create_payment(wallet_id: WalletID, body: CreateWalletPayment):
7779
"""Creates payment to wallet `wallet_id`"""
@@ -87,6 +89,7 @@ async def list_all_payments(params: Annotated[PageQueryParameters, Depends()]):
8789

8890
@router.post(
8991
"/wallets/{wallet_id}/payments/{payment_id}:cancel",
92+
response_description="Successfully cancelled",
9093
status_code=status.HTTP_204_NO_CONTENT,
9194
)
9295
async def cancel_payment(wallet_id: WalletID, payment_id: PaymentID):
@@ -99,6 +102,8 @@ async def cancel_payment(wallet_id: WalletID, payment_id: PaymentID):
99102
@router.post(
100103
"/wallets/{wallet_id}/payments-methods:init",
101104
response_model=Envelope[PaymentMethodInit],
105+
response_description="Successfully initialized",
106+
status_code=status.HTTP_202_ACCEPTED,
102107
)
103108
async def init_creation_of_payment_method(wallet_id: WalletID):
104109
...

packages/models-library/src/models_library/api_schemas_webserver/wallets.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,24 @@ class Config(OutputSchema.Config):
102102
}
103103

104104

105+
class PaymentMethodTransaction(OutputSchema):
106+
# Used ONLY in socketio interface
107+
wallet_id: WalletID
108+
payment_method_id: PaymentMethodID
109+
state: Literal["PENDING", "SUCCESS", "FAILED", "CANCELED"]
110+
111+
class Config(OutputSchema.Config):
112+
schema_extra: ClassVar[dict[str, Any]] = {
113+
"examples": [
114+
{
115+
"walletId": 1,
116+
"paymentMethodId": "pm_0987654321",
117+
"state": "SUCCESS",
118+
}
119+
]
120+
}
121+
122+
105123
class PaymentMethodGet(OutputSchema):
106124
idr: PaymentMethodID
107125
wallet_id: WalletID

services/payments/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.0
1+
1.1.0

services/payments/openapi.json

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"info": {
44
"title": "simcore-service-payments web API",
55
"description": " Service that manages creation and validation of registration payments",
6-
"version": "1.0.0"
6+
"version": "1.1.0"
77
},
88
"paths": {
99
"/": {
@@ -217,6 +217,15 @@
217217
"message": {
218218
"type": "string",
219219
"title": "Message"
220+
},
221+
"saved": {
222+
"allOf": [
223+
{
224+
"$ref": "#/components/schemas/SavedPaymentMethod"
225+
}
226+
],
227+
"title": "Saved",
228+
"description": "If the user decided to save the payment methodafter payment it returns the payment-method acknoledgement response.Otherwise it defaults to None."
220229
}
221230
},
222231
"type": "object",
@@ -226,8 +235,20 @@
226235
"title": "AckPayment"
227236
},
228237
"AckPaymentMethod": {
229-
"properties": {},
238+
"properties": {
239+
"success": {
240+
"type": "boolean",
241+
"title": "Success"
242+
},
243+
"message": {
244+
"type": "string",
245+
"title": "Message"
246+
}
247+
},
230248
"type": "object",
249+
"required": [
250+
"success"
251+
],
231252
"title": "AckPaymentMethod"
232253
},
233254
"Body_login_to_create_access_token": {
@@ -311,6 +332,29 @@
311332
"docs_url": "https://foo.io/doc"
312333
}
313334
},
335+
"SavedPaymentMethod": {
336+
"properties": {
337+
"success": {
338+
"type": "boolean",
339+
"title": "Success"
340+
},
341+
"message": {
342+
"type": "string",
343+
"title": "Message"
344+
},
345+
"payment_method_id": {
346+
"type": "string",
347+
"format": "uuid",
348+
"title": "Payment Method Id"
349+
}
350+
},
351+
"type": "object",
352+
"required": [
353+
"success",
354+
"payment_method_id"
355+
],
356+
"title": "SavedPaymentMethod"
357+
},
314358
"Token": {
315359
"properties": {
316360
"access_token": {

services/payments/setup.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 1.0.0
2+
current_version = 1.1.0
33
commit = True
44
message = services/payments version: {current_version} → {new_version}
55
tag = False
@@ -9,5 +9,5 @@ commit_args = --no-verify
99

1010
[tool:pytest]
1111
asyncio_mode = auto
12-
markers =
12+
markers =
1313
testit: "marks test to run during development"

services/payments/src/simcore_service_payments/models/schemas/acknowledgements.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,21 @@ class _BaseAck(BaseModel):
88
message: str = Field(default=None)
99

1010

11-
class AckPayment(_BaseAck):
11+
class AckPaymentMethod(_BaseAck):
1212
...
1313

1414

15-
class AckPaymentMethod(BaseModel):
16-
...
15+
class SavedPaymentMethod(AckPaymentMethod):
16+
payment_method_id: PaymentMethodID
17+
18+
19+
class AckPayment(_BaseAck):
20+
saved: SavedPaymentMethod | None = Field(
21+
default=None,
22+
description="If the user decided to save the payment method"
23+
"after payment it returns the payment-method acknoledgement response."
24+
"Otherwise it defaults to None.",
25+
)
1726

1827

1928
assert PaymentID # nosec

services/web/server/requirements/_base.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ aiosmtplib # email
3232
asyncpg # db
3333
cryptography # security
3434
expiringdict
35+
faker # Only used in dev-mode for proof-of-concepts
3536
gunicorn[setproctitle]
3637
jinja_app_loader # email
3738
json2html

services/web/server/requirements/_base.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ et-xmlfile==1.1.0
167167
# via openpyxl
168168
expiringdict==1.2.1
169169
# via -r requirements/_base.in
170+
faker==19.6.1
171+
# via -r requirements/_base.in
170172
frozenlist==1.3.0
171173
# via
172174
# aiohttp
@@ -338,7 +340,9 @@ pyjwt==2.4.0
338340
pyrsistent==0.18.1
339341
# via jsonschema
340342
python-dateutil==2.8.2
341-
# via arrow
343+
# via
344+
# arrow
345+
# faker
342346
python-engineio==4.3.4
343347
# via python-socketio
344348
python-magic==0.4.25

services/web/server/requirements/_test.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ exceptiongroup==1.1.3
5959
execnet==2.0.2
6060
# via pytest-xdist
6161
faker==19.6.1
62-
# via -r requirements/_test.in
62+
# via
63+
# -c requirements/_base.txt
64+
# -r requirements/_test.in
6365
flaky==3.7.0
6466
# via -r requirements/_test.in
6567
frozenlist==1.3.0

services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3806,8 +3806,8 @@ paths:
38063806
$ref: '#/components/schemas/CreateWalletPayment'
38073807
required: true
38083808
responses:
3809-
'200':
3810-
description: Successful Response
3809+
'202':
3810+
description: Successfully initialized
38113811
content:
38123812
application/json:
38133813
schema:
@@ -3870,7 +3870,7 @@ paths:
38703870
in: path
38713871
responses:
38723872
'204':
3873-
description: Successful Response
3873+
description: Successfully cancelled
38743874
/v0/wallets/{wallet_id}/payments-methods:init:
38753875
post:
38763876
tags:
@@ -3887,12 +3887,12 @@ paths:
38873887
name: wallet_id
38883888
in: path
38893889
responses:
3890-
'200':
3891-
description: Successful Response
3890+
'202':
3891+
description: Successfully initialized
38923892
content:
38933893
application/json:
38943894
schema:
3895-
$ref: '#/components/schemas/Envelope_CreatePaymentMethodInitiated_'
3895+
$ref: '#/components/schemas/Envelope_PaymentMethodInit_'
38963896
/v0/wallets/{wallet_id}/payments-methods/{payment_method_id}:cancel:
38973897
post:
38983898
tags:
@@ -4777,6 +4777,7 @@ components:
47774777
enum:
47784778
- AWS
47794779
- ON_PREMISE
4780+
- ON_DEMAND
47804781
type: string
47814782
description: An enumeration.
47824783
CodePageParams:
@@ -4804,30 +4805,6 @@ components:
48044805
title: Cluster Id
48054806
minimum: 0
48064807
type: integer
4807-
CreatePaymentMethodInitiated:
4808-
title: CreatePaymentMethodInitiated
4809-
required:
4810-
- walletId
4811-
- paymentMethodId
4812-
- paymentMethodFormUrl
4813-
type: object
4814-
properties:
4815-
walletId:
4816-
title: Walletid
4817-
exclusiveMinimum: true
4818-
type: integer
4819-
minimum: 0
4820-
paymentMethodId:
4821-
title: Paymentmethodid
4822-
minLength: 1
4823-
type: string
4824-
paymentMethodFormUrl:
4825-
title: Paymentmethodformurl
4826-
maxLength: 2083
4827-
minLength: 1
4828-
type: string
4829-
description: Link to external site that holds the payment submission form
4830-
format: uri
48314808
CreateWalletBodyParams:
48324809
title: CreateWalletBodyParams
48334810
required:
@@ -4997,14 +4974,6 @@ components:
49974974
$ref: '#/components/schemas/ComputationTaskGet'
49984975
error:
49994976
title: Error
5000-
Envelope_CreatePaymentMethodInitiated_:
5001-
title: Envelope[CreatePaymentMethodInitiated]
5002-
type: object
5003-
properties:
5004-
data:
5005-
$ref: '#/components/schemas/CreatePaymentMethodInitiated'
5006-
error:
5007-
title: Error
50084977
Envelope_Error_:
50094978
title: Envelope[Error]
50104979
type: object
@@ -5117,6 +5086,14 @@ components:
51175086
$ref: '#/components/schemas/PaymentMethodGet'
51185087
error:
51195088
title: Error
5089+
Envelope_PaymentMethodInit_:
5090+
title: Envelope[PaymentMethodInit]
5091+
type: object
5092+
properties:
5093+
data:
5094+
$ref: '#/components/schemas/PaymentMethodInit'
5095+
error:
5096+
title: Error
51205097
Envelope_PresignedLink_:
51215098
title: Envelope[PresignedLink]
51225099
type: object
@@ -6906,6 +6883,30 @@ components:
69066883
title: Created
69076884
type: string
69086885
format: date-time
6886+
PaymentMethodInit:
6887+
title: PaymentMethodInit
6888+
required:
6889+
- walletId
6890+
- paymentMethodId
6891+
- paymentMethodFormUrl
6892+
type: object
6893+
properties:
6894+
walletId:
6895+
title: Walletid
6896+
exclusiveMinimum: true
6897+
type: integer
6898+
minimum: 0
6899+
paymentMethodId:
6900+
title: Paymentmethodid
6901+
minLength: 1
6902+
type: string
6903+
paymentMethodFormUrl:
6904+
title: Paymentmethodformurl
6905+
maxLength: 2083
6906+
minLength: 1
6907+
type: string
6908+
description: Link to external site that holds the payment submission form
6909+
format: uri
69096910
PaymentTransaction:
69106911
title: PaymentTransaction
69116912
required:

0 commit comments

Comments
 (0)