diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index a7b351bce..981d9947d 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -86,6 +86,16 @@ class EntityAction extends EnumClass { return toSnakeCase(super.toString()); } + String toApiParam() { + final value = toString(); + + if (value.startsWith('email')) { + return 'email'; + } + + return value; + } + static BuiltSet get values => _$values; static EntityAction valueOf(String name) => _$valueOf(name); diff --git a/lib/data/repositories/client_repository.dart b/lib/data/repositories/client_repository.dart index f1cac3035..2307bdc49 100644 --- a/lib/data/repositories/client_repository.dart +++ b/lib/data/repositories/client_repository.dart @@ -45,7 +45,7 @@ class ClientRepository { final url = credentials.url + '/clients/bulk?include=gateway_tokens,activities'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final ClientListResponse clientResponse = serializers.deserializeWith(ClientListResponse.serializer, response); @@ -87,7 +87,7 @@ class ClientRepository { data: fields, filePath: filePath, fileIndex: 'documents[]'); final ClientItemResponse clientResponse = - serializers.deserializeWith(ClientItemResponse.serializer, response); + serializers.deserializeWith(ClientItemResponse.serializer, response); return clientResponse.data; } diff --git a/lib/data/repositories/company_gateway_repository.dart b/lib/data/repositories/company_gateway_repository.dart index 6302165d5..f166b8218 100644 --- a/lib/data/repositories/company_gateway_repository.dart +++ b/lib/data/repositories/company_gateway_repository.dart @@ -43,7 +43,7 @@ class CompanyGatewayRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/company_gateways/bulk?include=gateway'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final CompanyGatewayListResponse companyGatewayResponse = serializers .deserializeWith(CompanyGatewayListResponse.serializer, response); diff --git a/lib/data/repositories/credit_repository.dart b/lib/data/repositories/credit_repository.dart index cb1438c8a..df4151df3 100644 --- a/lib/data/repositories/credit_repository.dart +++ b/lib/data/repositories/credit_repository.dart @@ -41,7 +41,7 @@ class CreditRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/credits/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final InvoiceListResponse invoiceResponse = serializers.deserializeWith(InvoiceListResponse.serializer, response); diff --git a/lib/data/repositories/design_repository.dart b/lib/data/repositories/design_repository.dart index 16aa698be..f0d3d3543 100644 --- a/lib/data/repositories/design_repository.dart +++ b/lib/data/repositories/design_repository.dart @@ -40,7 +40,7 @@ class DesignRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/designs/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final DesignListResponse designResponse = serializers.deserializeWith(DesignListResponse.serializer, response); diff --git a/lib/data/repositories/document_repository.dart b/lib/data/repositories/document_repository.dart index af30d13a9..6ba5d5bd0 100644 --- a/lib/data/repositories/document_repository.dart +++ b/lib/data/repositories/document_repository.dart @@ -40,7 +40,7 @@ class DocumentRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/documents/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final DocumentListResponse documentResponse = serializers.deserializeWith(DocumentListResponse.serializer, response); diff --git a/lib/data/repositories/expense_repository.dart b/lib/data/repositories/expense_repository.dart index d43b03969..ed789e966 100644 --- a/lib/data/repositories/expense_repository.dart +++ b/lib/data/repositories/expense_repository.dart @@ -42,7 +42,7 @@ class ExpenseRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/expenses/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final ExpenseListResponse expenseResponse = serializers.deserializeWith(ExpenseListResponse.serializer, response); diff --git a/lib/data/repositories/group_repository.dart b/lib/data/repositories/group_repository.dart index d7e1d9a58..ccef0673b 100644 --- a/lib/data/repositories/group_repository.dart +++ b/lib/data/repositories/group_repository.dart @@ -40,7 +40,7 @@ class GroupRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/group_settings/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final GroupListResponse groupResponse = serializers.deserializeWith(GroupListResponse.serializer, response); diff --git a/lib/data/repositories/invoice_repository.dart b/lib/data/repositories/invoice_repository.dart index 982287aff..25d181726 100644 --- a/lib/data/repositories/invoice_repository.dart +++ b/lib/data/repositories/invoice_repository.dart @@ -19,7 +19,8 @@ class InvoiceRepository { Future loadItem( Credentials credentials, String entityId) async { final dynamic response = await webClient.get( - '${credentials.url}/invoices/$entityId?include=history', credentials.token); + '${credentials.url}/invoices/$entityId?include=history', + credentials.token); final InvoiceItemResponse invoiceResponse = await compute( computeDecode, [InvoiceItemResponse.serializer, response]); @@ -42,7 +43,7 @@ class InvoiceRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/invoices/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final InvoiceListResponse invoiceResponse = serializers.deserializeWith(InvoiceListResponse.serializer, response); diff --git a/lib/data/repositories/payment_repository.dart b/lib/data/repositories/payment_repository.dart index b060ea32a..18a79ac85 100644 --- a/lib/data/repositories/payment_repository.dart +++ b/lib/data/repositories/payment_repository.dart @@ -43,7 +43,7 @@ class PaymentRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/payments/bulk?include=paymentables'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final PaymentListResponse paymentResponse = serializers.deserializeWith(PaymentListResponse.serializer, response); diff --git a/lib/data/repositories/payment_term_repository.dart b/lib/data/repositories/payment_term_repository.dart index e73d8ee91..1ae24f927 100644 --- a/lib/data/repositories/payment_term_repository.dart +++ b/lib/data/repositories/payment_term_repository.dart @@ -41,7 +41,7 @@ class PaymentTermRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/payment_terms/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final PaymentTermListResponse paymentTermResponse = serializers .deserializeWith(PaymentTermListResponse.serializer, response); diff --git a/lib/data/repositories/product_repository.dart b/lib/data/repositories/product_repository.dart index 4232a53e3..1a41f4625 100644 --- a/lib/data/repositories/product_repository.dart +++ b/lib/data/repositories/product_repository.dart @@ -44,7 +44,7 @@ class ProductRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/products/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final ProductListResponse productResponse = serializers.deserializeWith(ProductListResponse.serializer, response); diff --git a/lib/data/repositories/project_repository.dart b/lib/data/repositories/project_repository.dart index 937a73ad3..e0a6348ed 100644 --- a/lib/data/repositories/project_repository.dart +++ b/lib/data/repositories/project_repository.dart @@ -42,7 +42,7 @@ class ProjectRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/projects/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final ProjectListResponse projectResponse = serializers.deserializeWith(ProjectListResponse.serializer, response); diff --git a/lib/data/repositories/quote_repository.dart b/lib/data/repositories/quote_repository.dart index efc30b338..4eb7b8ee9 100644 --- a/lib/data/repositories/quote_repository.dart +++ b/lib/data/repositories/quote_repository.dart @@ -42,7 +42,7 @@ class QuoteRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/quotes/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final InvoiceListResponse invoiceResponse = serializers.deserializeWith(InvoiceListResponse.serializer, response); diff --git a/lib/data/repositories/task_repository.dart b/lib/data/repositories/task_repository.dart index 610c989ec..2341b620a 100644 --- a/lib/data/repositories/task_repository.dart +++ b/lib/data/repositories/task_repository.dart @@ -41,7 +41,7 @@ class TaskRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/tasks/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final TaskListResponse taskResponse = serializers.deserializeWith(TaskListResponse.serializer, response); diff --git a/lib/data/repositories/tax_rate_repository.dart b/lib/data/repositories/tax_rate_repository.dart index 1ce77cee4..4ceb7d3fb 100644 --- a/lib/data/repositories/tax_rate_repository.dart +++ b/lib/data/repositories/tax_rate_repository.dart @@ -40,7 +40,7 @@ class TaxRateRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/tax_rates/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final TaxRateListResponse taxRateResponse = serializers.deserializeWith(TaxRateListResponse.serializer, response); diff --git a/lib/data/repositories/token_repository.dart b/lib/data/repositories/token_repository.dart index 788669667..00c6e7563 100644 --- a/lib/data/repositories/token_repository.dart +++ b/lib/data/repositories/token_repository.dart @@ -39,7 +39,7 @@ class TokenRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/tokens/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final TokenListResponse tokenResponse = serializers.deserializeWith(TokenListResponse.serializer, response); diff --git a/lib/data/repositories/user_repository.dart b/lib/data/repositories/user_repository.dart index 9f38a3cd1..84f4d1d90 100644 --- a/lib/data/repositories/user_repository.dart +++ b/lib/data/repositories/user_repository.dart @@ -40,7 +40,7 @@ class UserRepository { EntityAction action, String password) async { final url = credentials.url + '/users/bulk?include=company_user'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final UserListResponse userResponse = serializers.deserializeWith(UserListResponse.serializer, response); diff --git a/lib/data/repositories/vendor_repository.dart b/lib/data/repositories/vendor_repository.dart index 4dee21a60..ac2e8a78c 100644 --- a/lib/data/repositories/vendor_repository.dart +++ b/lib/data/repositories/vendor_repository.dart @@ -42,7 +42,7 @@ class VendorRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/vendors/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final VendorListResponse vendorResponse = serializers.deserializeWith(VendorListResponse.serializer, response); diff --git a/lib/data/repositories/webhook_repository.dart b/lib/data/repositories/webhook_repository.dart index fce7cb57e..d4be73c9c 100644 --- a/lib/data/repositories/webhook_repository.dart +++ b/lib/data/repositories/webhook_repository.dart @@ -40,7 +40,7 @@ class WebhookRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/webhooks/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final WebhookListResponse webhookResponse = serializers.deserializeWith(WebhookListResponse.serializer, response); diff --git a/lib/redux/invoice/invoice_middleware.dart b/lib/redux/invoice/invoice_middleware.dart index 5158dba7b..bf329d5c0 100644 --- a/lib/redux/invoice/invoice_middleware.dart +++ b/lib/redux/invoice/invoice_middleware.dart @@ -28,6 +28,7 @@ List> createStoreInvoicesMiddleware([ final deleteInvoice = _deleteInvoice(repository); final restoreInvoice = _restoreInvoice(repository); final emailInvoice = _emailInvoice(repository); + final bulkEmailInvoices = _bulkEmailInvoices(repository); final markInvoiceSent = _markInvoiceSent(repository); final markInvoicePaid = _markInvoicePaid(repository); final reverseInvoices = _reverseInvoices(repository); @@ -46,6 +47,7 @@ List> createStoreInvoicesMiddleware([ TypedMiddleware(deleteInvoice), TypedMiddleware(restoreInvoice), TypedMiddleware(emailInvoice), + TypedMiddleware(bulkEmailInvoices), TypedMiddleware(markInvoiceSent), TypedMiddleware(markInvoicePaid), TypedMiddleware(reverseInvoices), @@ -323,6 +325,30 @@ Middleware _emailInvoice(InvoiceRepository repository) { }; } +Middleware _bulkEmailInvoices(InvoiceRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as BulkEmailInvoicesRequest; + + repository + .bulkAction(store.state.credentials, action.invoiceIds, + EntityAction.emailInvoice) + .then((List invoices) { + store.dispatch(BulkEmailInvoicesSuccess(invoices)); + if (action.completer != null) { + action.completer.complete(null); + } + }).catchError((Object error) { + print(error); + store.dispatch(BulkEmailInvoicesFailure(error)); + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} + Middleware _saveInvoice(InvoiceRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as SaveInvoiceRequest; diff --git a/stubs/data/repositories/stub_repository b/stubs/data/repositories/stub_repository index 71659b156..493448b19 100644 --- a/stubs/data/repositories/stub_repository +++ b/stubs/data/repositories/stub_repository @@ -46,7 +46,7 @@ class StubRepository { Credentials credentials, List ids, EntityAction action) async { final url = credentials.url + '/stubs/bulk'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': '$action'})); + data: json.encode({'ids': ids, 'action': action.toApiParam()})); final StubListResponse stubResponse = serializers.deserializeWith(StubListResponse.serializer, response);