Spaces:
Sleeping
Sleeping
fix(audit-log): import INET from sqlalchemy.dialects.postgresql to resolve missing type error
Browse files- docs/hflogs/runtimeerror.txt +57 -247
- src/app/models/audit_log.py +2 -2
docs/hflogs/runtimeerror.txt
CHANGED
|
@@ -1,250 +1,60 @@
|
|
| 1 |
-
===== Application Startup at 2025-11-
|
| 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/
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 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/
|
| 135 |
-
self.
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
File "/usr/local/lib/python3.11/site-packages/
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 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="{"component":"errors/index","props":{"status":404},"url":"/messages","version":"","clearHistory":false,"encryptHistory":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 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_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-[>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 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_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-[>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 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_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-[>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
|
| 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
|