kamau1 commited on
Commit
215c34c
·
1 Parent(s): dacae32

fix(audit-log): import INET from sqlalchemy.dialects.postgresql to resolve missing type error

Browse files
docs/hflogs/runtimeerror.txt CHANGED
@@ -1,250 +1,60 @@
1
- ===== Application Startup at 2025-11-15 23:03:39 =====
2
 
3
- INFO: Started server process [7]
4
- INFO: Waiting for application startup.
5
- INFO:app.main:============================================================
6
- INFO:app.main:Built by Lewis Kimaru
7
- INFO:app.main:============================================================
8
- INFO:app.main:Starting SwiftOps API v1.0.0
9
- INFO:app.main:Environment: production
10
- INFO:app.main:
11
- INFO:app.main:Database Connection Check:
12
- INFO:app.main: Supabase URL: https://exatfwiwyhiftwvatlpm.supabase.co
13
- INFO:app.main: Status: Connected
14
- INFO:app.main: Database: postgres
15
- INFO:app.main: User: postgres
16
- INFO:app.main: PostgreSQL: PostgreSQL 17.6 on aarch64-unknown-linux-gnu
17
- INFO:app.main: Tables: 42 tables found
18
- INFO:app.main: Core tables: All 5 verified
19
- INFO:app.main: Users: 9 active users
20
- INFO:app.main: Health: OK
21
- INFO:app.main:
22
- INFO:app.main:External Services Check:
23
- INFO:httpx:HTTP Request: GET https://www.wasenderapi.com/api/status "HTTP/1.1 200 OK"
24
- INFO:httpx:HTTP Request: GET https://exatfwiwyhiftwvatlpm.supabase.co/storage/v1/bucket "HTTP/1.1 200 OK"
25
- INFO:app.main: Cloudinary: Connected
26
- INFO:app.main: Cloud: dnhajmziu
27
- INFO:app.main: Resend: Configured
28
- INFO:app.main: WASender (WhatsApp): Connected
29
- INFO:app.main: WhatsApp: connected
30
- INFO:app.main: Note: WhatsApp is connected and ready
31
- INFO:app.main: Supabase Storage: Connected
32
- INFO:app.main: Buckets: 0
33
- INFO:app.main:
34
- INFO:app.main:Application startup complete
35
- INFO:app.main:============================================================
36
- INFO: Application startup complete.
37
- INFO: Uvicorn running on http://0.0.0.0:7860 (Press CTRL+C to quit)
38
- INFO: 10.16.6.135:9302 - "GET / HTTP/1.1" 200 OK
39
- INFO: 10.16.6.135:9302 - "GET / HTTP/1.1" 200 OK
40
- INFO: 10.16.12.123:57699 - "GET /health HTTP/1.1" 200 OK
41
- INFO:httpx:HTTP Request: POST https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/token?grant_type=password "HTTP/1.1 200 OK"
42
- INFO:app.core.supabase_auth:User signed in successfully: lewis.kamau421@gmail.com
43
- INFO:app.api.v1.auth:User logged in successfully: lewis.kamau421@gmail.com
44
- INFO: 10.16.6.135:56822 - "POST /api/v1/auth/login HTTP/1.1" 200 OK
45
- INFO:httpx:HTTP Request: GET https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/user "HTTP/1.1 200 OK"
46
- INFO:app.api.v1.contractors:Contractor with email 'info@techinstall.co.ke' already exists
47
- INFO: 10.16.12.123:57699 - "POST /api/v1/contractors HTTP/1.1" 201 Created
48
- INFO:httpx:HTTP Request: GET https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/user "HTTP/1.1 200 OK"
49
- INFO: 10.16.24.211:36422 - "POST /api/v1/invitations HTTP/1.1" 500 Internal Server Error
50
- ERROR: Exception in ASGI application
51
  Traceback (most recent call last):
52
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
53
- self.dialect.do_execute(
54
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 922, in do_execute
55
- cursor.execute(statement, parameters)
56
- psycopg2.errors.UndefinedColumn: column user_invitations.deleted_at does not exist
57
- LINE 1: ...ations.updated_at AS user_invitations_updated_at, user_invit...
58
- ^
59
-
60
-
61
- The above exception was the direct cause of the following exception:
62
-
63
- Traceback (most recent call last):
64
- File "/usr/local/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 426, in run_asgi
65
- result = await app( # type: ignore[func-returns-value]
66
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
67
- File "/usr/local/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__
68
- return await self.app(scope, receive, send)
69
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
70
- File "/usr/local/lib/python3.11/site-packages/fastapi/applications.py", line 1106, in __call__
71
- await super().__call__(scope, receive, send)
72
- File "/usr/local/lib/python3.11/site-packages/starlette/applications.py", line 122, in __call__
73
- await self.middleware_stack(scope, receive, send)
74
- File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 184, in __call__
75
- raise exc
76
- File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 162, in __call__
77
- await self.app(scope, receive, _send)
78
- File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 83, in __call__
79
- await self.app(scope, receive, send)
80
- File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
81
- raise exc
82
- File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
83
- await self.app(scope, receive, sender)
84
- File "/usr/local/lib/python3.11/site-packages/fastapi/middleware/asyncexitstack.py", line 20, in __call__
85
- raise e
86
- File "/usr/local/lib/python3.11/site-packages/fastapi/middleware/asyncexitstack.py", line 17, in __call__
87
- await self.app(scope, receive, send)
88
- File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 718, in __call__
89
- await route.handle(scope, receive, send)
90
- File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 276, in handle
91
- await self.app(scope, receive, send)
92
- File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 66, in app
93
- response = await func(request)
94
- ^^^^^^^^^^^^^^^^^^^
95
- File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 274, in app
96
- raw_response = await run_endpoint_function(
97
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
98
- File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 191, in run_endpoint_function
99
- return await dependant.call(**values)
100
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
101
- File "/app/src/app/api/v1/invitations.py", line 54, in create_invitation
102
- invitation = await invitation_service.create_invitation(
103
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
104
- File "/app/src/app/services/invitation_service.py", line 76, in create_invitation
105
- ).first()
106
- ^^^^^^^
107
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 2748, in first
108
- return self.limit(1)._iter().first() # type: ignore
109
- ^^^^^^^^^^^^^^^^^^^^^
110
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 2847, in _iter
111
- result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
112
- ^^^^^^^^^^^^^^^^^^^^^
113
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2308, in execute
114
- return self._execute_internal(
115
- ^^^^^^^^^^^^^^^^^^^^^^^
116
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2190, in _execute_internal
117
- result: Result[Any] = compile_state_cls.orm_execute_statement(
118
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
119
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/orm/context.py", line 293, in orm_execute_statement
120
- result = conn.execute(
121
- ^^^^^^^^^^^^^
122
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1416, in execute
123
- return meth(
124
- ^^^^^
125
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 516, in _execute_on_connection
126
- return connection._execute_clauseelement(
127
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
128
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1639, in _execute_clauseelement
129
- ret = self._execute_context(
130
- ^^^^^^^^^^^^^^^^^^^^^^
131
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1848, in _execute_context
132
- return self._exec_single_context(
133
  ^^^^^^^^^^^^^^^^^^^^^^^^^^
134
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1988, in _exec_single_context
135
- self._handle_dbapi_exception(
136
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2343, in _handle_dbapi_exception
137
- raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
138
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
139
- self.dialect.do_execute(
140
- File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 922, in do_execute
141
- cursor.execute(statement, parameters)
142
- sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedColumn) column user_invitations.deleted_at does not exist
143
- LINE 1: ...ations.updated_at AS user_invitations_updated_at, user_invit...
144
- ^
145
-
146
- [SQL: SELECT user_invitations.email AS user_invitations_email, user_invitations.phone AS user_invitations_phone, user_invitations.invited_role AS user_invitations_invited_role, user_invitations.client_id AS user_invitations_client_id, user_invitations.contractor_id AS user_invitations_contractor_id, user_invitations.token AS user_invitations_token, user_invitations.status AS user_invitations_status, user_invitations.invitation_method AS user_invitations_invitation_method, user_invitations.invited_by_user_id AS user_invitations_invited_by_user_id, user_invitations.invited_at AS user_invitations_invited_at, user_invitations.expires_at AS user_invitations_expires_at, user_invitations.accepted_at AS user_invitations_accepted_at, user_invitations.whatsapp_sent AS user_invitations_whatsapp_sent, user_invitations.whatsapp_sent_at AS user_invitations_whatsapp_sent_at, user_invitations.whatsapp_error AS user_invitations_whatsapp_error, user_invitations.email_sent AS user_invitations_email_sent, user_invitations.email_sent_at AS user_invitations_email_sent_at, user_invitations.email_error AS user_invitations_email_error, user_invitations.invitation_metadata AS user_invitations_invitation_metadata, user_invitations.id AS user_invitations_id, user_invitations.created_at AS user_invitations_created_at, user_invitations.updated_at AS user_invitations_updated_at, user_invitations.deleted_at AS user_invitations_deleted_at
147
- FROM user_invitations
148
- WHERE user_invitations.email = %(email_1)s AND user_invitations.status = %(status_1)s AND (user_invitations.client_id IS NULL OR user_invitations.contractor_id = %(contractor_id_1)s::UUID)
149
- LIMIT %(param_1)s]
150
- [parameters: {'email_1': 'irene@example.com', 'status_1': 'pending', 'contractor_id_1': UUID('20000000-0000-0000-0000-000000000001'), 'param_1': 1}]
151
- (Background on this error at: https://sqlalche.me/e/20/f405)
152
- INFO: 10.16.12.123:29797 - "GET /health HTTP/1.1" 200 OK
153
- INFO:httpx:HTTP Request: POST https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/token?grant_type=password "HTTP/1.1 200 OK"
154
- INFO:app.core.supabase_auth:User signed in successfully: lewis.kamau421@gmail.com
155
- INFO:app.api.v1.auth:User logged in successfully: lewis.kamau421@gmail.com
156
- INFO: 10.16.6.135:27868 - "POST /api/v1/auth/login HTTP/1.1" 200 OK
157
- INFO:httpx:HTTP Request: GET https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/user "HTTP/1.1 200 OK"
158
- INFO:app.api.v1.contractors:Contractor with email 'info@techinstall.co.ke' already exists
159
- INFO: 10.16.12.123:29797 - "POST /api/v1/contractors HTTP/1.1" 201 Created
160
- INFO:httpx:HTTP Request: GET https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/user "HTTP/1.1 200 OK"
161
- INFO:httpx:HTTP Request: POST https://www.wasenderapi.com/messages "HTTP/1.1 404 Not Found"
162
- ERROR:app.services.notification_service:WaSender API error: 404 - <!DOCTYPE html>
163
- <html lang="en" class="">
164
- <head>
165
- <meta charset="utf-8">
166
- <meta name="viewport" content="width=device-width, initial-scale=1">
167
- <script async src="https://www.googletagmanager.com/gtag/js?id=G-KM8QTS9EJZ"></script>
168
- <link rel="icon" type="image/png" href=https://www.wasenderapi.com/favicon-96x96.png sizes="96x96" />
169
- <link rel="icon" type="image/svg+xml" href=https://www.wasenderapi.com/favicon.svg />
170
- <link rel="shortcut icon" href=https://www.wasenderapi.com/favicon.ico />
171
- <link rel="apple-touch-icon" sizes="180x180" href="https://www.wasenderapi.com/apple-touch-icon.png" />
172
- <meta name="apple-mobile-web-app-title" content="WasenderAPI" />
173
- <link rel="manifest" href=https://www.wasenderapi.com/site.webmanifest />
174
- <script>
175
- window.dataLayer = window.dataLayer || [];
176
- function gtag(){dataLayer.push(arguments);}
177
- gtag('js', new Date());
178
- gtag('config', 'G-KM8QTS9EJZ');
179
- </script>
180
-
181
- <script src="https://cdn.paddle.com/paddle/v2/paddle.js"></script>
182
- <script type="text/javascript">
183
- Paddle.Initialize({
184
- token: "live_c90f691403a136205e93da51d76"
185
- });
186
- </script>
187
-
188
-
189
- <!-- Reddit Pixel -->
190
- <script>
191
- !function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement("script");t.src="https://www.redditstatic.com/ads/pixel.js",t.async=!0;var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}}(window,document);rdt('init','a2_h4x0gpxpc1tl');rdt('track', 'PageVisit');
192
- </script>
193
- <!-- DO NOT MODIFY UNLESS TO REPLACE A USER IDENTIFIER -->
194
- <!-- End Reddit Pixel -->
195
-
196
- <script>
197
- (function() {
198
- const appearance = 'light';
199
-
200
- if (appearance === 'system') {
201
- const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
202
-
203
- if (prefersDark) {
204
- document.documentElement.classList.add('dark');
205
- }
206
- }
207
- })();
208
- </script>
209
-
210
- <style>
211
- html {
212
- background-color: oklch(1 0 0);
213
- }
214
-
215
- html.dark {
216
- background-color: oklch(0.145 0 0);
217
- }
218
- </style>
219
-
220
- <title inertia>WasenderApi - Low Cost WhatsApp API for Developers</title>
221
-
222
- <link rel="preconnect" href="https://fonts.bunny.net">
223
- <link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
224
-
225
- <script type="text/javascript">const Ziggy={"url":"https:\/\/www.wasenderapi.com","port":null,"defaults":{},"routes":{"login":{"uri":"login","methods":["GET","HEAD"]},"logout":{"uri":"logout","methods":["POST"]},"password.request":{"uri":"forgot-password","methods":["GET","HEAD"]},"password.reset":{"uri":"reset-password\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"password.email":{"uri":"forgot-password","methods":["POST"]},"password.store":{"uri":"reset-password","methods":["POST"]},"register":{"uri":"register","methods":["GET","HEAD"]},"user-profile-information.update":{"uri":"user\/profile-information","methods":["PUT"]},"user-password.update":{"uri":"user\/password","methods":["PUT"]},"password.confirm":{"uri":"user\/confirm-password","methods":["GET","HEAD"]},"password.confirmation":{"uri":"user\/confirmed-password-status","methods":["GET","HEAD"]},"password.confirm.store":{"uri":"user\/confirm-password","methods":["POST"]},"two-factor.login":{"uri":"two-factor-challenge","methods":["GET","HEAD"]},"two-factor.login.store":{"uri":"two-factor-challenge","methods":["POST"]},"two-factor.enable":{"uri":"user\/two-factor-authentication","methods":["POST"]},"two-factor.confirm":{"uri":"user\/confirmed-two-factor-authentication","methods":["POST"]},"two-factor.disable":{"uri":"user\/two-factor-authentication","methods":["DELETE"]},"two-factor.qr-code":{"uri":"user\/two-factor-qr-code","methods":["GET","HEAD"]},"two-factor.secret-key":{"uri":"user\/two-factor-secret-key","methods":["GET","HEAD"]},"two-factor.recovery-codes":{"uri":"user\/two-factor-recovery-codes","methods":["GET","HEAD"]},"two-factor.regenerate-recovery-codes":{"uri":"user\/two-factor-recovery-codes","methods":["POST"]},"status.api":{"uri":"api\/health","methods":["GET","HEAD"]},"health-check":{"uri":"api\/up","methods":["GET","HEAD"]},"home":{"uri":"\/","methods":["GET","HEAD"]},"auth-status":{"uri":"auth-status","methods":["GET","HEAD"]},"sitemap":{"uri":"sitemap.xml","methods":["GET","HEAD"]},"dashboard":{"uri":"dashboard","methods":["GET","HEAD"]},"link-preview":{"uri":"link-preview","methods":["GET","HEAD"]},"profile.edit":{"uri":"settings\/profile","methods":["GET","HEAD"]},"profile.update":{"uri":"settings\/profile","methods":["PATCH"]},"profile.destroy":{"uri":"settings\/profile","methods":["DELETE"]},"password.edit":{"uri":"settings\/password","methods":["GET","HEAD"]},"password.update":{"uri":"settings\/password","methods":["PUT"]},"appearance":{"uri":"settings\/appearance","methods":["GET","HEAD"]},"tokens.index":{"uri":"settings\/tokens","methods":["GET","HEAD"]},"tokens.store":{"uri":"settings\/tokens","methods":["POST"]},"tokens.destroy":{"uri":"settings\/tokens\/{token_id}","methods":["DELETE"],"parameters":["token_id"]},"preferences.edit":{"uri":"settings\/preferences","methods":["GET","HEAD"]},"preferences.update":{"uri":"settings\/preferences","methods":["PATCH"]},"settings.two-factor":{"uri":"settings\/two-factor","methods":["GET","HEAD"]},"github.login":{"uri":"auth\/github","methods":["GET","HEAD"]},"github.callback":{"uri":"auth\/github\/callback","methods":["GET","HEAD"]},"google.login":{"uri":"auth\/google","methods":["GET","HEAD"]},"google.callback":{"uri":"auth\/google\/callback","methods":["GET","HEAD"]},"verification.notice":{"uri":"verify-email","methods":["GET","HEAD"]},"verification.verify":{"uri":"verify-email\/{id}\/{hash}","methods":["GET","HEAD"],"parameters":["id","hash"]},"verification.send":{"uri":"email\/verification-notification","methods":["POST"]},"subscription.index":{"uri":"subscription","methods":["GET","HEAD"]},"subscription.checkout":{"uri":"subscription\/checkout\/{plan}","methods":["GET","HEAD"],"parameters":["plan"],"bindings":{"plan":"slug"}},"paid-subscription.success":{"uri":"subscription\/paid\/success\/{plan}","methods":["GET","HEAD"],"parameters":["plan"],"bindings":{"plan":"slug"}},"free-subscription.success":{"uri":"subscription\/trial\/success","methods":["GET","HEAD"]},"subscription.show":{"uri":"subscription\/show","methods":["GET","HEAD"]},"subscription.payment-method.edit":{"uri":"subscription\/payment-method","methods":["GET","HEAD"]},"subscription.cancel":{"uri":"subscription\/cancel","methods":["POST"]},"subscription.resume":{"uri":"subscription\/resume","methods":["POST"]},"subscription.pause":{"uri":"subscription\/pause-subscription","methods":["POST"]},"subscription.undo-cancel":{"uri":"subscription\/undo-cancel","methods":["POST"]},"subscription.change-plan":{"uri":"subscription\/change-plan\/{plan}","methods":["POST"],"parameters":["plan"],"bindings":{"plan":"slug"}},"subscription.upgrade":{"uri":"subscription\/upgrade","methods":["GET","HEAD"]},"subscription.resubscribe":{"uri":"subscription\/resubscribe","methods":["POST"]},"subscription.retry-failed-payments":{"uri":"subscription\/retry-failed-payments","methods":["POST"]},"subscription.one-time-access":{"uri":"subscription\/partner","methods":["GET","HEAD"]},"whatsapp.index":{"uri":"whatsapp","methods":["GET","HEAD"]},"whatsapp.create":{"uri":"whatsapp\/create","methods":["GET","HEAD"]},"whatsapp.store":{"uri":"whatsapp","methods":["POST"]},"whatsapp.show":{"uri":"whatsapp\/manage\/{whatsappSession}","methods":["GET","HEAD"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.edit":{"uri":"whatsapp\/{whatsappSession}\/edit","methods":["GET","HEAD"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.update":{"uri":"whatsapp\/{whatsappSession}","methods":["PUT"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.regenerate-api-key":{"uri":"whatsapp\/{whatsappSession}\/regenerate-api-key","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.destroy":{"uri":"whatsapp\/{whatsappSession}","methods":["DELETE"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.qr-code":{"uri":"whatsapp\/{whatsappSession}\/get-qr-code","methods":["GET","HEAD"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.connect":{"uri":"whatsapp\/{whatsappSession}\/connect","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.disconnect":{"uri":"whatsapp\/{whatsappSession}\/disconnect","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.restart":{"uri":"whatsapp\/{whatsappSession}\/restart","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.clear-logs":{"uri":"whatsapp\/{whatsappSession}\/clear-logs","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.clear-messages":{"uri":"whatsapp\/{whatsappSession}\/clear-messages","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.resend-message":{"uri":"whatsapp\/{whatsappSession}\/resend-message","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"whatsapp.test-webhook":{"uri":"whatsapp\/{whatsappSession}\/test-webhook","methods":["POST"],"parameters":["whatsappSession"],"bindings":{"whatsappSession":"id"}},"api-docs.index":{"uri":"api-docs","methods":["GET","HEAD"]},"api-docs.category.show":{"uri":"api-docs\/{category_slug}","methods":["GET","HEAD"],"parameters":["category_slug"]},"api-docs.show":{"uri":"api-docs\/{category_slug}\/{entry_slug}","methods":["GET","HEAD"],"parameters":["category_slug","entry_slug"]},"blog.index":{"uri":"blog","methods":["GET","HEAD"]},"blog.show":{"uri":"blog\/{slug}","methods":["GET","HEAD"],"parameters":["slug"]},"blog.category":{"uri":"blog\/category\/{slug}","methods":["GET","HEAD"],"parameters":["slug"]},"help":{"uri":"help","methods":["GET","HEAD"]},"help.category":{"uri":"help\/{category}","methods":["GET","HEAD"],"parameters":["category"]},"help.article":{"uri":"help\/{category}\/{article}","methods":["GET","HEAD"],"parameters":["category","article"]},"contact":{"uri":"contact","methods":["GET","HEAD"]},"contact.submit":{"uri":"contact\/submit","methods":["POST"]},"about":{"uri":"about","methods":["GET","HEAD"]},"privacy":{"uri":"privacy","methods":["GET","HEAD"]},"terms":{"uri":"terms","methods":["GET","HEAD"]},"refund":{"uri":"refund-policy","methods":["GET","HEAD"]},"partner":{"uri":"partner","methods":["GET","HEAD"]},"status":{"uri":"status","methods":["GET","HEAD"]},"status.subscribe":{"uri":"status\/subscribe","methods":["POST"]},"status.unsubscribe":{"uri":"status\/unsubscribe","methods":["DELETE"]},"storage.local":{"uri":"storage\/{path}","methods":["GET","HEAD"],"wheres":{"path":".*"},"parameters":["path"]}}};!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t||self).route=e()}(this,function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,u(r.key),r)}}function e(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function n(){return n=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)({}).hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},n.apply(null,arguments)}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function o(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(o=function(){return!!t})()}function i(t,e){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},i(t,e)}function u(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(o())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var u=new(t.bind.apply(t,r));return n&&i(u,n.prototype),u}(t,arguments,r(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),i(n,t)},f(t)}const c=String.prototype.replace,l=/%20/g,a={RFC1738:function(t){return c.call(t,l,"+")},RFC3986:function(t){return String(t)}};var s="RFC3986";const p=Object.prototype.hasOwnProperty,y=Array.isArray,d=function(){const t=[];for(let e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),b=function t(e,n,r){if(!n)return e;if("object"!=typeof n){if(y(e))e.push(n);else{if(!e||"object"!=typeof e)return[e,n];(r&&(r.plainObjects||r.allowPrototypes)||!p.call(Object.prototype,n))&&(e[n]=!0)}return e}if(!e||"object"!=typeof e)return[e].concat(n);let o=e;return y(e)&&!y(n)&&(o=function(t,e){const n=e&&e.plainObjects?Object.create(null):{};for(let e=0;e<t.length;++e)void 0!==t[e]&&(n[e]=t[e]);return n}(e,r)),y(e)&&y(n)?(n.forEach(function(n,o){if(p.call(e,o)){const i=e[o];i&&"object"==typeof i&&n&&"object"==typeof n?e[o]=t(i,n,r):e.push(n)}else e[o]=n}),e):Object.keys(n).reduce(function(e,o){const i=n[o];return e[o]=p.call(e,o)?t(e[o],i,r):i,e},o)},h=1024,v=function(t,e){return[].concat(t,e)},m=function(t,e){if(y(t)){const n=[];for(let r=0;r<t.length;r+=1)n.push(e(t[r]));return n}return e(t)},g=Object.prototype.hasOwnProperty,w={brackets:function(t){return t+"[]"},comma:"comma",indices:function(t,e){return t+"["+e+"]"},repeat:function(t){return t}},j=Array.isArray,O=Array.prototype.push,E=function(t,e){O.apply(t,j(e)?e:[e])},T=Date.prototype.toISOString,R={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:function(t,e,n,r,o){if(0===t.length)return t;let i=t;if("symbol"==typeof t?i=Symbol.prototype.toString.call(t):"string"!=typeof t&&(i=String(t)),"iso-8859-1"===n)return escape(i).replace(/%u[0-9a-f]{4}/gi,function(t){return"%26%23"+parseInt(t.slice(2),16)+"%3B"});let u="";for(let t=0;t<i.length;t+=h){const e=i.length>=h?i.slice(t,t+h):i,n=[];for(let t=0;t<e.length;++t){let r=e.charCodeAt(t);45===r||46===r||95===r||126===r||r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||"RFC1738"===o&&(40===r||41===r)?n[n.length]=e.charAt(t):r<128?n[n.length]=d[r]:r<2048?n[n.length]=d[192|r>>6]+d[128|63&r]:r<55296||r>=57344?n[n.length]=d[224|r>>12]+d[128|r>>6&63]+d[128|63&r]:(t+=1,r=65536+((1023&r)<<10|1023&e.charCodeAt(t)),n[n.length]=d[240|r>>18]+d[128|r>>12&63]+d[128|r>>6&63]+d[128|63&r])}u+=n.join("")}return u},encodeValuesOnly:!1,format:s,formatter:a[s],indices:!1,serializeDate:function(t){return T.call(t)},skipNulls:!1,strictNullHandling:!1},S={},k=function(t,e,n,r,o,i,u,f,c,l,a,s,p,y,d,b,h,v){let g=t,w=v,O=0,T=!1;for(;void 0!==(w=w.get(S))&&!T;){const e=w.get(t);if(O+=1,void 0!==e){if(e===O)throw new RangeError("Cyclic object value");T=!0}void 0===w.get(S)&&(O=0)}if("function"==typeof l?g=l(e,g):g instanceof Date?g=p(g):"comma"===n&&j(g)&&(g=m(g,function(t){return t instanceof Date?p(t):t})),null===g){if(i)return c&&!b?c(e,R.encoder,h,"key",y):e;g=""}if("string"==typeof(A=g)||"number"==typeof A||"boolean"==typeof A||"symbol"==typeof A||"bigint"==typeof A||function(t){return!(!t||"object"!=typeof t||!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t)))}(g))return c?[d(b?e:c(e,R.encoder,h,"key",y))+"="+d(c(g,R.encoder,h,"value",y))]:[d(e)+"="+d(String(g))];var A;const D=[];if(void 0===g)return D;let I;if("comma"===n&&j(g))b&&c&&(g=m(g,c)),I=[{value:g.length>0?g.join(",")||null:void 0}];else if(j(l))I=l;else{const t=Object.keys(g);I=a?t.sort(a):t}const $=f?e.replace(/\./g,"%2E"):e,N=r&&j(g)&&1===g.length?$+"[]":$;if(o&&j(g)&&0===g.length)return N+"[]";for(let e=0;e<I.length;++e){const m=I[e],w="object"==typeof m&&void 0!==m.value?m.value:g[m];if(u&&null===w)continue;const T=s&&f?m.replace(/\./g,"%2E"):m,R=j(g)?"function"==typeof n?n(N,T):N:N+(s?"."+T:"["+T+"]");v.set(t,O);const A=new WeakMap;A.set(S,v),E(D,k(w,R,n,r,o,i,u,f,"comma"===n&&b&&j(g)?null:c,l,a,s,p,y,d,b,h,A))}return D},A=Object.prototype.hasOwnProperty,D=Array.isArray,I={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:function(t,e,n){const r=t.replace(/\+/g," ");if("iso-8859-1"===n)return r.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(r)}catch(t){return r}},delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},$=function(t){return t.replace(/&#(\d+);/g,function(t,e){return String.fromCharCode(parseInt(e,10))})},N=function(t,e){return t&&"string"==typeof t&&e.comma&&t.indexOf(",")>-1?t.split(","):t},x=function(t,e,n,r){if(!t)return;const o=n.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,i=/(\[[^[\]]*])/g;let u=n.depth>0&&/(\[[^[\]]*])/.exec(o);const f=u?o.slice(0,u.index):o,c=[];if(f){if(!n.plainObjects&&A.call(Object.prototype,f)&&!n.allowPrototypes)return;c.push(f)}let l=0;for(;n.depth>0&&null!==(u=i.exec(o))&&l<n.depth;){if(l+=1,!n.plainObjects&&A.call(Object.prototype,u[1].slice(1,-1))&&!n.allowPrototypes)return;c.push(u[1])}return u&&c.push("["+o.slice(u.index)+"]"),function(t,e,n,r){let o=r?e:N(e,n);for(let e=t.length-1;e>=0;--e){let r;const i=t[e];if("[]"===i&&n.parseArrays)r=n.allowEmptyArrays&&""===o?[]:[].concat(o);else{r=n.plainObjects?Object.create(null):{};const t="["===i.charAt(0)&&"]"===i.charAt(i.length-1)?i.slice(1,-1):i,e=n.decodeDotInKeys?t.replace(/%2E/g,"."):t,u=parseInt(e,10);n.parseArrays||""!==e?!isNaN(u)&&i!==e&&String(u)===e&&u>=0&&n.parseArrays&&u<=n.arrayLimit?(r=[],r[u]=o):"__proto__"!==e&&(r[e]=o):r={0:o}}o=r}return o}(c,e,n,r)};function C(t,e){const n=function(t){if(!t)return I;if(void 0!==t.allowEmptyArrays&&"boolean"!=typeof t.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==t.decodeDotInKeys&&"boolean"!=typeof t.decodeDotInKeys)throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");if(null!=t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");const e=void 0===t.charset?I.charset:t.charset,n=void 0===t.duplicates?I.duplicates:t.duplicates;if("combine"!==n&&"first"!==n&&"last"!==n)throw new TypeError("The duplicates option must be either combine, first, or last");return{allowDots:void 0===t.allowDots?!0===t.decodeDotInKeys||I.allowDots:!!t.allowDots,allowEmptyArrays:"boolean"==typeof t.allowEmptyArrays?!!t.allowEmptyArrays:I.allowEmptyArrays,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:I.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:I.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:I.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:I.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:I.comma,decodeDotInKeys:"boolean"==typeof t.decodeDotInKeys?t.decodeDotInKeys:I.decodeDotInKeys,decoder:"function"==typeof t.decoder?t.decoder:I.decoder,delimiter:"string"==typeof t.delimiter||(r=t.delimiter,"[object RegExp]"===Object.prototype.toString.call(r))?t.delimiter:I.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:I.depth,duplicates:n,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:I.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:I.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:I.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:I.strictNullHandling};var r}(e);if(""===t||null==t)return n.plainObjects?Object.create(null):{};const r="string"==typeof t?function(t,e){const n={__proto__:null},r=(e.ignoreQueryPrefix?t.replace(/^\?/,""):t).split(e.delimiter,Infinity===e.parameterLimit?void 0:e.parameterLimit);let o,i=-1,u=e.charset;if(e.charsetSentinel)for(o=0;o<r.length;++o)0===r[o].indexOf("utf8=")&&("utf8=%E2%9C%93"===r[o]?u="utf-8":"utf8=%26%2310003%3B"===r[o]&&(u="iso-8859-1"),i=o,o=r.length);for(o=0;o<r.length;++o){if(o===i)continue;const t=r[o],f=t.indexOf("]="),c=-1===f?t.indexOf("="):f+1;let l,a;-1===c?(l=e.decoder(t,I.decoder,u,"key"),a=e.strictNullHandling?null:""):(l=e.decoder(t.slice(0,c),I.decoder,u,"key"),a=m(N(t.slice(c+1),e),function(t){return e.decoder(t,I.decoder,u,"value")})),a&&e.interpretNumericEntities&&"iso-8859-1"===u&&(a=$(a)),t.indexOf("[]=")>-1&&(a=D(a)?[a]:a);const s=A.call(n,l);s&&"combine"===e.duplicates?n[l]=v(n[l],a):s&&"last"!==e.duplicates||(n[l]=a)}return n}(t,n):t;let o=n.plainObjects?Object.create(null):{};const i=Object.keys(r);for(let e=0;e<i.length;++e){const u=i[e],f=x(u,r[u],n,"string"==typeof t);o=b(o,f,n)}return!0===n.allowSparse?o:function(t){const e=[{obj:{o:t},prop:"o"}],n=[];for(let t=0;t<e.length;++t){const r=e[t],o=r.obj[r.prop],i=Object.keys(o);for(let t=0;t<i.length;++t){const r=i[t],u=o[r];"object"==typeof u&&null!==u&&-1===n.indexOf(u)&&(e.push({obj:o,prop:r}),n.push(u))}}return function(t){for(;t.length>1;){const e=t.pop(),n=e.obj[e.prop];if(y(n)){const t=[];for(let e=0;e<n.length;++e)void 0!==n[e]&&t.push(n[e]);e.obj[e.prop]=t}}}(e),t}(o)}var P=/*#__PURE__*/function(){function t(t,e,n){var r,o;this.name=t,this.definition=e,this.bindings=null!=(r=e.bindings)?r:{},this.wheres=null!=(o=e.wheres)?o:{},this.config=n}var n=t.prototype;return n.matchesUrl=function(t){var e,n=this;if(!this.definition.methods.includes("GET"))return!1;var r=this.template.replace(/[.*+$()[\]]/g,"\\$&").replace(/(\/?){([^}?]*)(\??)}/g,function(t,e,r,o){var i,u="(?<"+r+">"+((null==(i=n.wheres[r])?void 0:i.replace(/(^\^)|(\$$)/g,""))||"[^/?]+")+")";return o?"("+e+u+")?":""+e+u}).replace(/^\w+:\/\//,""),o=t.replace(/^\w+:\/\//,"").split("?"),i=o[0],u=o[1],f=null!=(e=new RegExp("^"+r+"/?$").exec(i))?e:new RegExp("^"+r+"/?$").exec(decodeURI(i));if(f){for(var c in f.groups)f.groups[c]="string"==typeof f.groups[c]?decodeURIComponent(f.groups[c]):f.groups[c];return{params:f.groups,query:C(u)}}return!1},n.compile=function(t){var e=this;return this.parameterSegments.length?this.template.replace(/{([^}?]+)(\??)}/g,function(n,r,o){var i,u;if(!o&&[null,void 0].includes(t[r]))throw new Error("Ziggy error: '"+r+"' parameter is required for route '"+e.name+"'.");if(e.wheres[r]&&!new RegExp("^"+(o?"("+e.wheres[r]+")?":e.wheres[r])+"$").test(null!=(u=t[r])?u:""))throw new Error("Ziggy error: '"+r+"' parameter '"+t[r]+"' does not match required format '"+e.wheres[r]+"' for route '"+e.name+"'.");return encodeURI(null!=(i=t[r])?i:"").replace(/%7C/g,"|").replace(/%25/g,"%").replace(/\$/g,"%24")}).replace(this.config.absolute?/(\.[^/]+?)(\/\/)/:/(^)(\/\/)/,"$1/").replace(/\/+$/,""):this.template},e(t,[{key:"template",get:function(){var t=(this.origin+"/"+this.definition.uri).replace(/\/+$/,"");return""===t?"/":t}},{key:"origin",get:function(){return this.config.absolute?this.definition.domain?""+this.config.url.match(/^\w+:\/\//)[0]+this.definition.domain+(this.config.port?":"+this.config.port:""):this.config.url:""}},{key:"parameterSegments",get:function(){var t,e;return null!=(t=null==(e=this.template.match(/{[^}?]+\??}/g))?void 0:e.map(function(t){return{name:t.replace(/{|\??}/g,""),required:!/\?}$/.test(t)}}))?t:[]}}])}(),_=/*#__PURE__*/function(t){function r(e,r,o,i){var u;if(void 0===o&&(o=!0),(u=t.call(this)||this).t=null!=i?i:"undefined"!=typeof Ziggy?Ziggy:null==globalThis?void 0:globalThis.Ziggy,!u.t&&"undefined"!=typeof document&&document.getElementById("ziggy-routes-json")&&(globalThis.Ziggy=JSON.parse(document.getElementById("ziggy-routes-json").textContent),u.t=globalThis.Ziggy),u.t=n({},u.t,{absolute:o}),e){if(!u.t.routes[e])throw new Error("Ziggy error: route '"+e+"' is not in the route list.");u.i=new P(e,u.t.routes[e],u.t),u.u=u.l(r)}return u}var o,u;u=t,(o=r).prototype=Object.create(u.prototype),o.prototype.constructor=o,i(o,u);var f=r.prototype;return f.toString=function(){var t=this,e=Object.keys(this.u).filter(function(e){return!t.i.parameterSegments.some(function(t){return t.name===e})}).filter(function(t){return"_query"!==t}).reduce(function(e,r){var o;return n({},e,((o={})[r]=t.u[r],o))},{});return this.i.compile(this.u)+function(t,e){let n=t;const r=function(t){if(!t)return R;if(void 0!==t.allowEmptyArrays&&"boolean"!=typeof t.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==t.encodeDotInKeys&&"boolean"!=typeof t.encodeDotInKeys)throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(null!=t.encoder&&"function"!=typeof t.encoder)throw new TypeError("Encoder has to be a function.");const e=t.charset||R.charset;if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let n=s;if(void 0!==t.format){if(!g.call(a,t.format))throw new TypeError("Unknown format option provided.");n=t.format}const r=a[n];let o,i=R.filter;if(("function"==typeof t.filter||j(t.filter))&&(i=t.filter),o=t.arrayFormat in w?t.arrayFormat:"indices"in t?t.indices?"indices":"repeat":R.arrayFormat,"commaRoundTrip"in t&&"boolean"!=typeof t.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");return{addQueryPrefix:"boolean"==typeof t.addQueryPrefix?t.addQueryPrefix:R.addQueryPrefix,allowDots:void 0===t.allowDots?!0===t.encodeDotInKeys||R.allowDots:!!t.allowDots,allowEmptyArrays:"boolean"==typeof t.allowEmptyArrays?!!t.allowEmptyArrays:R.allowEmptyArrays,arrayFormat:o,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:R.charsetSentinel,commaRoundTrip:t.commaRoundTrip,delimiter:void 0===t.delimiter?R.delimiter:t.delimiter,encode:"boolean"==typeof t.encode?t.encode:R.encode,encodeDotInKeys:"boolean"==typeof t.encodeDotInKeys?t.encodeDotInKeys:R.encodeDotInKeys,encoder:"function"==typeof t.encoder?t.encoder:R.encoder,encodeValuesOnly:"boolean"==typeof t.encodeValuesOnly?t.encodeValuesOnly:R.encodeValuesOnly,filter:i,format:n,formatter:r,serializeDate:"function"==typeof t.serializeDate?t.serializeDate:R.serializeDate,skipNulls:"boolean"==typeof t.skipNulls?t.skipNulls:R.skipNulls,sort:"function"==typeof t.sort?t.sort:null,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:R.strictNullHandling}}(e);let o,i;"function"==typeof r.filter?(i=r.filter,n=i("",n)):j(r.filter)&&(i=r.filter,o=i);const u=[];if("object"!=typeof n||null===n)return"";const f=w[r.arrayFormat],c="comma"===f&&r.commaRoundTrip;o||(o=Object.keys(n)),r.sort&&o.sort(r.sort);const l=new WeakMap;for(let t=0;t<o.length;++t){const e=o[t];r.skipNulls&&null===n[e]||E(u,k(n[e],e,f,c,r.allowEmptyArrays,r.strictNullHandling,r.skipNulls,r.encodeDotInKeys,r.encode?r.encoder:null,r.filter,r.sort,r.allowDots,r.serializeDate,r.format,r.formatter,r.encodeValuesOnly,r.charset,l))}const p=u.join(r.delimiter);let y=!0===r.addQueryPrefix?"?":"";return r.charsetSentinel&&(y+="iso-8859-1"===r.charset?"utf8=%26%2310003%3B&":"utf8=%E2%9C%93&"),p.length>0?y+p:""}(n({},e,this.u._query),{addQueryPrefix:!0,arrayFormat:"indices",encodeValuesOnly:!0,skipNulls:!0,encoder:function(t,e){return"boolean"==typeof t?Number(t):e(t)}})},f.p=function(t){var e=this;t?this.t.absolute&&t.startsWith("/")&&(t=this.h().host+t):t=this.v();var r={},o=Object.entries(this.t.routes).find(function(n){return r=new P(n[0],n[1],e.t).matchesUrl(t)})||[void 0,void 0];return n({name:o[0]},r,{route:o[1]})},f.v=function(){var t=this.h(),e=t.pathname,n=t.search;return(this.t.absolute?t.host+e:e.replace(this.t.url.replace(/^\w*:\/\/[^/]+/,""),"").replace(/^\/+/,"/"))+n},f.current=function(t,e){var r=this.p(),o=r.name,i=r.params,u=r.query,f=r.route;if(!t)return o;var c=new RegExp("^"+t.replace(/\./g,"\\.").replace(/\*/g,".*")+"$").test(o);if([null,void 0].includes(e)||!c)return c;var l=new P(o,f,this.t);e=this.l(e,l);var a=n({},i,u);if(Object.values(e).every(function(t){return!t})&&!Object.values(a).some(function(t){return void 0!==t}))return!0;var s=function(t,e){return Object.entries(t).every(function(t){var n=t[0],r=t[1];return Array.isArray(r)&&Array.isArray(e[n])?r.every(function(t){return e[n].includes(t)||e[n].includes(decodeURIComponent(t))}):"object"==typeof r&&"object"==typeof e[n]&&null!==r&&null!==e[n]?s(r,e[n]):e[n]==r||e[n]==decodeURIComponent(r)})};return s(e,a)},f.h=function(){var t,e,n,r,o,i,u="undefined"!=typeof window?window.location:{},f=u.host,c=u.pathname,l=u.search;return{host:null!=(t=null==(e=this.t.location)?void 0:e.host)?t:void 0===f?"":f,pathname:null!=(n=null==(r=this.t.location)?void 0:r.pathname)?n:void 0===c?"":c,search:null!=(o=null==(i=this.t.location)?void 0:i.search)?o:void 0===l?"":l}},f.has=function(t){return this.t.routes.hasOwnProperty(t)},f.l=function(t,e){var r=this;void 0===t&&(t={}),void 0===e&&(e=this.i),null!=t||(t={}),t=["string","number"].includes(typeof t)?[t]:t;var o=e.parameterSegments.filter(function(t){return!r.t.defaults[t.name]});if(Array.isArray(t))t=t.reduce(function(t,e,r){var i,u;return n({},t,o[r]?((i={})[o[r].name]=e,i):"object"==typeof e?e:((u={})[e]="",u))},{});else if(1===o.length&&!t[o[0].name]&&(t.hasOwnProperty(Object.values(e.bindings)[0])||t.hasOwnProperty("id"))){var i;(i={})[o[0].name]=t,t=i}return n({},this.m(e),this.j(t,e))},f.m=function(t){var e=this;return t.parameterSegments.filter(function(t){return e.t.defaults[t.name]}).reduce(function(t,r,o){var i,u=r.name;return n({},t,((i={})[u]=e.t.defaults[u],i))},{})},f.j=function(t,e){var r=e.bindings,o=e.parameterSegments;return Object.entries(t).reduce(function(t,e){var i,u,f=e[0],c=e[1];if(!c||"object"!=typeof c||Array.isArray(c)||!o.some(function(t){return t.name===f}))return n({},t,((u={})[f]=c,u));if(!c.hasOwnProperty(r[f])){if(!c.hasOwnProperty("id"))throw new Error("Ziggy error: object passed as '"+f+"' parameter is missing route model binding key '"+r[f]+"'.");r[f]="id"}return n({},t,((i={})[f]=c[r[f]],i))},{})},f.valueOf=function(){return this.toString()},e(r,[{key:"params",get:function(){var t=this.p();return n({},t.params,t.query)}},{key:"routeParams",get:function(){return this.p().params}},{key:"queryParams",get:function(){return this.p().query}}])}(/*#__PURE__*/f(String));return function(t,e,n,r){var o=new _(t,e,n,r);return t?o.toString():o}});
226
- </script> <link rel="preload" as="style" href="https://www.wasenderapi.com/build/assets/app-B25sliBa.css" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/app-D2TUoe-h.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/index-CyXY-3Ye.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/button-CR635cJg.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/proxy-CPw5b5lA.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/arrow-left-B6EOqN-l.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/circle-help-LRiPwwQh.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/mail-BmYRyf4p.js" /><link rel="modulepreload" as="script" href="https://www.wasenderapi.com/build/assets/createLucideIcon-BCQWbVFG.js" /><link rel="stylesheet" href="https://www.wasenderapi.com/build/assets/app-B25sliBa.css" /><script type="module" src="https://www.wasenderapi.com/build/assets/app-D2TUoe-h.js"></script><script type="module" src="https://www.wasenderapi.com/build/assets/index-CyXY-3Ye.js"></script> <title inertia>404: Page Not Found - WasenderApi - Low Cost WhatsApp API for Developers</title>
227
- <!-- Google tag (gtag.js) -->
228
- <script async src="https://www.googletagmanager.com/gtag/js?id=AW-11143446523"></script>
229
- <script>
230
- window.dataLayer = window.dataLayer || [];
231
- function gtag(){dataLayer.push(arguments);}
232
- gtag('js', new Date());
233
-
234
- gtag('config', 'AW-11143446523');
235
- </script>
236
-
237
-
238
- </head>
239
- <body class="font-sans antialiased">
240
- <div id="app" data-page="{&quot;component&quot;:&quot;errors/index&quot;,&quot;props&quot;:{&quot;status&quot;:404},&quot;url&quot;:&quot;/messages&quot;,&quot;version&quot;:&quot;&quot;,&quot;clearHistory&quot;:false,&quot;encryptHistory&quot;:false}"><div class="bg-dark-background relative flex min-h-screen items-center justify-center overflow-hidden"><div class="pointer-events-none absolute inset-0"><div class="absolute inset-0 bg-[linear-gradient(to_right,#ffffff03_1px,transparent_1px),linear-gradient(to_bottom,#ffffff03_1px,transparent_1px)] bg-[size:30px_30px]"></div><div class="absolute inset-0 bg-[linear-gradient(to_right,#ffffff01_1px,transparent_1px),linear-gradient(to_bottom,#ffffff01_1px,transparent_1px)] bg-[size:100px_100px]"></div><div class="from-dark-background via-dark-background absolute inset-0 bg-gradient-to-b to-gray-900"></div></div><div class="pointer-events-none absolute inset-0"><div class="bg-accent/5 absolute -top-80 -right-80 h-[500px] w-[500px] rounded-full blur-[120px]"></div><div class="absolute bottom-0 left-0 h-[400px] w-[400px] rounded-full bg-[#075e54]/5 blur-[100px]"></div><div class="absolute top-1/4 left-1/4 h-[200px] w-[200px] rounded-full bg-blue-500/3 blur-[80px]"></div><div class="absolute top-3/4 right-1/3 h-[150px] w-[150px] rounded-full bg-purple-500/3 blur-[60px]"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:36.56723283066281%;top:50.75936103802683%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:50.292961151447926%;top:84.36007307471853%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:60.780236721812095%;top:60.895977520379695%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:5.168235920274489%;top:90.20197914019847%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:27.731784302149578%;top:74.15734668086003%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:4.220330058188337%;top:40.748785403289325%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:32.57321352136089%;top:62.64855392864162%"></div><div class="absolute h-1 w-1 rounded-full bg-white/20" style="left:69.04713230919019%;top:35.26092502825997%"></div></div><div class="relative z-10 container mx-auto px-4 py-8"><div class="text-center" style="opacity:0"><div class="mb-6 cursor-pointer sm:mb-8" style="opacity:0;transform:scale(0) rotateY(-180deg)"><h1 class="relative text-6xl font-bold text-white sm:text-8xl md:text-9xl" style="text-shadow:0 0 40px rgba(255, 255, 255, 0.1), 0 0 80px rgba(255, 255, 255, 0.05)"><span class="inline-block" style="opacity:0;transform:translateY(50px)">4</span><span class="inline-block" style="opacity:0;transform:translateY(50px)">0</span><span class="inline-block" style="opacity:0;transform:translateY(50px)">4</span><div class="absolute inset-0 -z-10 bg-gradient-to-r from-transparent via-white/5 to-transparent"></div></h1><p class="mt-2 text-xl font-medium text-white/90 sm:mt-4 sm:text-2xl md:text-3xl" style="opacity:0;transform:translateY(20px)">404: Page Not Found</p></div><div class="relative mx-auto max-w-2xl overflow-hidden rounded-2xl border border-white/10 bg-white/5 backdrop-blur-sm" style="opacity:0;transform:translateY(30px) scale(0.9)"><div class="absolute inset-0 -translate-x-full bg-gradient-to-r from-transparent via-white/5 to-transparent"></div><div class="relative p-6 sm:p-8"><p class="mb-6 text-lg leading-relaxed text-white/70 sm:mb-8 sm:text-xl" style="opacity:0">Sorry, the page you are looking for could not be found.</p><div class="flex flex-col items-center justify-center gap-3 sm:flex-row sm:gap-4" style="opacity:0;transform:translateY(20px)"><div tabindex="0"><a data-slot="button" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground shadow-xs hover:bg-primary/90 h-10 rounded-md px-6 has-[&gt;svg]:px-4 group w-full sm:w-auto" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left mr-2 h-5 w-5 transition-transform group-hover:-translate-x-1"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg>Back to Home</a></div><div tabindex="0"><a data-slot="button" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground h-10 rounded-md px-6 has-[&gt;svg]:px-4 group w-full sm:w-auto" href="/help"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-help mr-2 h-5 w-5 transition-transform group-hover:rotate-12"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg>Get Help</a></div><div tabindex="0"><a data-slot="button" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground h-10 rounded-md px-6 has-[&gt;svg]:px-4 group w-full sm:w-auto" href="/contact"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mail mr-2 h-5 w-5 transition-transform group-hover:rotate-12"><rect width="20" height="16" x="2" y="4" rx="2"></rect><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"></path></svg>Contact Us</a></div></div></div></div></div></div></div></div></body>
241
- </html>
242
-
243
- WARNING:app.services.notification_service:WhatsApp failed, will try email fallback: WaSender API error: 404
244
- INFO:httpx:HTTP Request: POST https://api.resend.com/emails "HTTP/1.1 200 OK"
245
- INFO:app.services.notification_service:Email invitation sent to irene@example.com
246
- INFO:app.services.invitation_service:Invitation created for irene@example.com by lewis.kamau421@gmail.com
247
- INFO: 10.16.6.135:27868 - "POST /api/v1/invitations HTTP/1.1" 201 Created
248
- INFO: 10.16.12.123:1334 - "POST /api/v1/invitations/validate HTTP/1.1" 200 OK
249
- INFO:httpx:HTTP Request: GET https://exatfwiwyhiftwvatlpm.supabase.co/auth/v1/user "HTTP/1.1 200 OK"
250
- INFO: 10.16.6.135:27868 - "GET /api/v1/invitations?limit=10 HTTP/1.1" 200 OK
 
1
+ ===== Application Startup at 2025-11-16 00:14:51 =====
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  Traceback (most recent call last):
4
+ File "/usr/local/bin/uvicorn", line 8, in <module>
5
+ sys.exit(main())
6
+ ^^^^^^
7
+ File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1485, in __call__
8
+ return self.main(*args, **kwargs)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  ^^^^^^^^^^^^^^^^^^^^^^^^^^
10
+ File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1406, in main
11
+ rv = self.invoke(ctx)
12
+ ^^^^^^^^^^^^^^^^
13
+ File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1269, in invoke
14
+ return ctx.invoke(self.callback, **ctx.params)
15
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
16
+ File "/usr/local/lib/python3.11/site-packages/click/core.py", line 824, in invoke
17
+ return callback(*args, **kwargs)
18
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
19
+ File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 416, in main
20
+ run(
21
+ File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 587, in run
22
+ server.run()
23
+ File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 61, in run
24
+ return asyncio.run(self.serve(sockets=sockets))
25
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
26
+ File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
27
+ return runner.run(main)
28
+ ^^^^^^^^^^^^^^^^
29
+ File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
30
+ return self._loop.run_until_complete(task)
31
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
32
+ File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete
33
+ File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 68, in serve
34
+ config.load()
35
+ File "/usr/local/lib/python3.11/site-packages/uvicorn/config.py", line 467, in load
36
+ self.loaded_app = import_from_string(self.app)
37
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
38
+ File "/usr/local/lib/python3.11/site-packages/uvicorn/importer.py", line 21, in import_from_string
39
+ module = importlib.import_module(module_str)
40
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41
+ File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
42
+ return _bootstrap._gcd_import(name[level:], package, level)
43
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
44
+ File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
45
+ File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
46
+ File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
47
+ File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
48
+ File "<frozen importlib._bootstrap_external>", line 940, in exec_module
49
+ File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
50
+ File "/app/src/app/main.py", line 187, in <module>
51
+ from app.api.v1.router import api_router
52
+ File "/app/src/app/api/v1/router.py", line 5, in <module>
53
+ from app.api.v1 import auth, clients, contractors, invitations, profile
54
+ File "/app/src/app/api/v1/auth.py", line 14, in <module>
55
+ from app.services.audit_service import AuditService
56
+ File "/app/src/app/services/audit_service.py", line 9, in <module>
57
+ from app.models.audit_log import AuditLog
58
+ File "/app/src/app/models/audit_log.py", line 4, in <module>
59
+ from sqlalchemy import Column, String, Text, INET
60
+ ImportError: cannot import name 'INET' from 'sqlalchemy' (/usr/local/lib/python3.11/site-packages/sqlalchemy/__init__.py)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/models/audit_log.py CHANGED
@@ -1,8 +1,8 @@
1
  """
2
  Audit Log Model
3
  """
4
- from sqlalchemy import Column, String, Text, INET
5
- from sqlalchemy.dialects.postgresql import UUID, JSONB
6
  from datetime import datetime
7
  from app.core.database import Base
8
  import uuid
 
1
  """
2
  Audit Log Model
3
  """
4
+ from sqlalchemy import Column, String, Text
5
+ from sqlalchemy.dialects.postgresql import UUID, JSONB, INET
6
  from datetime import datetime
7
  from app.core.database import Base
8
  import uuid