64 Commits

Author SHA1 Message Date
ealmeida 8bd8c6642f docs(okf): frontmatter OKF + rich abstracts nas descriptions
Build AAB — WhatSMS Gateway / build (push) Failing after 8m0s
Normalizacao OKF dos .md: type/title/description/timestamp/layer +
descriptions factuais (rich abstracts). Apenas .md tracked; corpos intactos.
Parte da aplicacao OKF a /Dados/Dev (28-06-2026).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 23:09:26 +01:00
ealmeida 83464df908 chore: remove old schema path 20.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 41s
2026-04-24 18:57:07 +00:00
ealmeida bc76cfcd49 chore: remove old schema path 19.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 36s
2026-04-24 18:57:03 +00:00
ealmeida 9078fe89de chore: remove old schema path 18.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 42s
2026-04-24 18:56:58 +00:00
ealmeida 3eb36a9006 chore: remove old schema path 17.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 23s
2026-04-24 18:56:53 +00:00
ealmeida 2a00670bbb chore: remove old schema path 16.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 31s
2026-04-24 18:56:48 +00:00
ealmeida 7c5ad0a4c9 chore: remove old schema path 15.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 43s
2026-04-24 18:56:43 +00:00
ealmeida 209a9a9ba1 chore: remove old schema path 14.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 31s
2026-04-24 18:56:38 +00:00
ealmeida d04f04716c chore: remove old schema path 13.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 37s
2026-04-24 18:56:33 +00:00
ealmeida 143a67e47b chore: remove old schema path 12.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 39s
2026-04-24 18:56:29 +00:00
ealmeida 125bd31264 chore: remove old schema path 11.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 32s
2026-04-24 18:55:50 +00:00
ealmeida 116c4c6377 chore: remove old schema path 10.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 43s
2026-04-24 18:55:45 +00:00
ealmeida d5f910763f chore: remove old schema path 9.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 29s
2026-04-24 18:55:40 +00:00
ealmeida f79996995e chore: remove old schema path 8.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 43s
2026-04-24 18:55:34 +00:00
ealmeida 5b53b61416 chore: remove old schema path 7.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 37s
2026-04-24 18:55:31 +00:00
ealmeida 2c7f515e3b chore: remove old schema path 6.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 3m18s
2026-04-24 18:55:26 +00:00
ealmeida 97cfafd47e chore: remove old schema path 5.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 6m8s
2026-04-24 18:55:22 +00:00
ealmeida 044f08bcd0 chore: remove old schema path 4.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 7m18s
2026-04-24 18:55:18 +00:00
ealmeida d2b23833a3 chore: remove old schema path 3.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 7m19s
2026-04-24 18:55:13 +00:00
ealmeida f200c2c0d0 chore: remove old schema path 2.json (package rename)
Build AAB — WhatSMS Gateway / build (push) Failing after 5m44s
2026-04-24 18:55:09 +00:00
ealmeida db740e4aaa fix(room-schema): remove old package path schemas (cleanup me.capcom.smsgateway) 1/20
Build AAB — WhatSMS Gateway / build (push) Failing after 5m13s
2026-04-24 18:53:53 +00:00
ealmeida 74ac47f497 fix(room-schema): add schema 20 at new package path pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 4m50s
2026-04-24 18:53:06 +00:00
ealmeida 03d5e86006 fix(room-schema): add schema 19 at new package path pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 5m3s
2026-04-24 18:47:40 +00:00
ealmeida 9e352e366e fix: add Room schema 18 to new package path pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 5m15s
2026-04-24 18:43:00 +00:00
ealmeida 0e8161f2fa fix: add Room schema 17 to new package path pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 5m2s
2026-04-24 18:40:26 +00:00
ealmeida a2add4112e fix(room): add schema 16 to pt.whatsms.gateway path
Build AAB — WhatSMS Gateway / build (push) Failing after 3m38s
2026-04-24 18:34:59 +00:00
ealmeida 92d07fb47f fix(room): add schema 15 to pt.whatsms.gateway path
Build AAB — WhatSMS Gateway / build (push) Failing after 3m47s
2026-04-24 18:32:53 +00:00
ealmeida 7ac4df014c fix(schemas): copiar schema v14 para path pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 2m29s
2026-04-24 18:27:48 +00:00
ealmeida 91848e5fea fix(schemas): copiar schema v13 para path pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 2m26s
2026-04-24 18:25:45 +00:00
ealmeida 26e8129408 chore: migrate Room schema 12 to pt.whatsms.gateway package path
Build AAB — WhatSMS Gateway / build (push) Failing after 3m44s
2026-04-24 18:20:12 +00:00
ealmeida a6ac97962e chore: migrate Room schema 11 to pt.whatsms.gateway package path
Build AAB — WhatSMS Gateway / build (push) Failing after 3m48s
2026-04-24 18:18:16 +00:00
ealmeida d385d1c39c chore: migrate Room schema to pt.whatsms.gateway package path (10.json)
Build AAB — WhatSMS Gateway / build (push) Failing after 5m52s
2026-04-24 18:14:58 +00:00
ealmeida 1d58d24006 chore: migrate Room schema to pt.whatsms.gateway package path (9.json)
Build AAB — WhatSMS Gateway / build (push) Failing after 5m52s
2026-04-24 18:13:31 +00:00
ealmeida 5c8c1b2e77 chore: migrate Room schema to pt.whatsms.gateway package path (8.json)
Build AAB — WhatSMS Gateway / build (push) Failing after 5m51s
2026-04-24 18:12:30 +00:00
ealmeida 21897c2be6 chore: migrate Room schema to pt.whatsms.gateway package path (7.json)
Build AAB — WhatSMS Gateway / build (push) Failing after 3m35s
2026-04-24 18:11:56 +00:00
ealmeida f0224be20b chore: migrate Room schema to pt.whatsms.gateway package path (6.json)
Build AAB — WhatSMS Gateway / build (push) Failing after 3m48s
2026-04-24 18:11:05 +00:00
ealmeida 9c7e37e6c7 fix: migrar schemas Room para novo package pt.whatsms.gateway (schema 5)
Build AAB — WhatSMS Gateway / build (push) Failing after 3m59s
2026-04-24 18:08:24 +00:00
ealmeida d23b64e5dd fix: migrar schemas Room para novo package pt.whatsms.gateway (schema 4)
Build AAB — WhatSMS Gateway / build (push) Failing after 4m25s
2026-04-24 18:07:43 +00:00
ealmeida daa3348ccf fix: migrar schemas Room para novo package pt.whatsms.gateway (schema 3)
Build AAB — WhatSMS Gateway / build (push) Failing after 27s
2026-04-24 18:07:08 +00:00
ealmeida 17682811ac fix: migrar schemas Room para novo package pt.whatsms.gateway (schema 2)
Build AAB — WhatSMS Gateway / build (push) Failing after 35s
2026-04-24 18:06:35 +00:00
ealmeida a67505217c fix: migrar schemas Room para novo package pt.whatsms.gateway (1-5)
Build AAB — WhatSMS Gateway / build (push) Failing after 35s
2026-04-24 18:05:49 +00:00
ealmeida 11185406d9 fix: substituir URLs sms-gate.app/capcom6 em strings.xml por whatsms.pt
Build AAB — WhatSMS Gateway / build (push) Failing after 2m46s
2026-04-24 17:36:11 +00:00
ealmeida 7737b9d6df fix: remover URLs sms-gate.app residuais de GatewaySettings
Build AAB — WhatSMS Gateway / build (push) Failing after 36s
2026-04-24 17:35:30 +00:00
ealmeida 5c5b35f9e2 refactor: renomear package me.capcom.smsgateway → pt.whatsms.gateway
Build AAB — WhatSMS Gateway / build (push) Failing after 34s
- namespace, applicationId, todos os ficheiros .kt/.xml/.gradle actualizados
- directório me/capcom/smsgateway/ → pt/whatsms/gateway/
- zero referências a capcom no código fonte
2026-04-24 18:28:08 +01:00
ealmeida 1cb31d1615 ci: substituir upload-artifact por release Gitea (fix ECONNREFUSED 127.0.1.1:443)
Build AAB — WhatSMS Gateway / build (push) Successful in 4m33s
2026-04-24 16:57:29 +00:00
ealmeida fa6f7e0a21 fix: descodificar root_preferences.xml (estava double-base64 encoded)
Build AAB — WhatSMS Gateway / build (push) Failing after 7m10s
2026-04-24 16:49:01 +00:00
ealmeida 391ba14ce8 ci: fix workflow YAML (era base64 literal) + --network host para checkout funcionar
Build AAB — WhatSMS Gateway / build (push) Failing after 1m20s
2026-04-24 16:42:37 +00:00
ealmeida 1d6084148e ci: fix checkout — add --network host to container (Gitea HTTPS not reachable from isolated Docker network) 2026-04-24 16:41:17 +00:00
ealmeida 88bc875055 ci: assembleRelease → bundleRelease (AAB obrigatório Play Store)
Build AAB — WhatSMS Gateway / build (push) Failing after 59s
2026-04-24 16:36:34 +00:00
ealmeida f780311b3e build: targetSdk + compileSdk 33 → 34 (Play Store requirement)
Build APK — WhatSMS Gateway / build (push) Failing after 1m2s
2026-04-24 16:36:29 +00:00
ealmeida 98db49ca24 ci: Gitea Actions workflow para build APK release v3.2.0
Build APK — WhatSMS Gateway / build (push) Failing after 4m5s
- Runner: mingc/android-build-box:latest (JDK 17)
- Injecta google-services.json a partir de secret
- Decode keystore.jks a partir de KEYSTORE_BASE64
- assembleRelease com signing via env vars
- Upload APK como artefacto da run
- Trigger: push feat/whatsms-branding-ptpt + workflow_dispatch
2026-04-24 16:30:53 +00:00
ealmeida 63e6936f9b build: upgrade Gradle wrapper 8.0 → 8.7 (suporte Java 21)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 01:41:57 +01:00
ealmeida a3285cc4a2 feat(android): QR pairing — ZXing scanner + ScanPairingActivity + strings PT-PT
- Adiciona dependência zxing-android-embedded:4.3.0
- Adiciona permissão CAMERA e regista ScanPairingActivity no Manifest
- Cria ScanPairingActivity: scan QR → parse JSON → POST claim-device
- Adiciona preferência "Emparelhar dispositivo" nas definições do servidor
- Adiciona handler de clique em WhatSmsServerSettingsFragment
- Strings PT-PT: scan_qr_to_pair, pairing_success/failed/cancelled/error
- Bump versionName para 3.2.0

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-23 00:55:46 +01:00
ealmeida 05efaf185c feat(android-ui): add PT-PT strings for WhatSMS Server settings panel 2026-04-22 23:05:14 +00:00
ealmeida 0f67dfd686 feat(android-ui): simplify settings to 2 panels (WhatSMS Server + Mensagens) 2026-04-22 23:01:37 +00:00
ealmeida a4a65f4214 feat(android-ui): add WhatSmsServerSettingsFragment (merged Local+Cloud) 2026-04-22 23:00:41 +00:00
ealmeida abaaedbf30 feat(android-ui): add whatsms_server_preferences.xml (simplified cloud panel) 2026-04-22 22:59:10 +00:00
ealmeida ea44b0d15d chore(version): bump 10 -> 11, 3.0.0-branding -> 3.1.0-hardcode
Publish Docs / build (release) Successful in 14s
Release / Build insecure (release) Failing after 1m23s
Release / Build release (release) Failing after 2m43s
Release / release (release) Has been skipped
2026-04-22 23:10:05 +01:00
ealmeida ed0047778d fix(icon): remove webp duplicates (conflict com ic_launcher.png) 2026-04-22 23:07:16 +01:00
ealmeida f289bf210c feat(hardcode): URL + private_token do WhatSMS hardcoded em GatewaySettings
Remove necessidade de o utilizador colar manualmente server URL e private
token nas definições. Após instalação + toggle Cloud Server ON, a app
auto-regista no smsgw.whatsms.pt silenciosamente.

- WHATSMS_SERVER_URL constante (https://smsgw.whatsms.pt/api/mobile/v1)
- WHATSMS_PRIVATE_TOKEN constante (a6c877b0... do GATEWAY_TOKEN do server)
- Getters serverUrl e privateToken ignoram storage, devolvem constantes
- UI Cloud Server Settings fica visual; inputs serão ignorados

Próximo: remover campos da UI + adicionar QR scanner para pairing auto.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:05:55 +01:00
ealmeida 407dc2f819 feat(icon): substitui ícone por logo WhatSMS oficial (SVG rasterizado)
Rasteriza frontend/public/whatsms.svg (gradient verde 1024x1024) em
PNG para 5 densidades Android (48/72/96/144/192) via inkscape. Substitui
ícone adaptativo anterior que ficava pobre.

Remove:
- mipmap-anydpi-v26/ic_launcher*.xml (adaptive icon XMLs)
- drawable/ic_launcher_foreground.xml (vector foreground deprecado)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:03:08 +01:00
ealmeida 2417c6f576 fix(manifest,version): install-blockers para Android 14+ + bump version
Fixes aplicados após auditoria LLM externa:
- uses-feature android.hardware.telephony: required true -> false
  (permite instalação em tablets/emuladores sem chip)
- remove uses-permission MANAGE_SUBSCRIPTION_USER_ASSOCIATION
  (é permissão de sistema/fabricante; Android 14+ bloqueia apps comuns)
- adiciona FOREGROUND_SERVICE_DATA_SYNC + FOREGROUND_SERVICE_CONNECTED_DEVICE
  (obrigatórias para foregroundServiceType em Android 14+)
- versionCode 1 -> 10, versionName 1.0.0 -> 3.0.0-branding
  (permite upgrade over v2.1 custom app com versionCode 3)

Não-fix aplicados (auditoria enganou-se):
- APK está assinado (v1 + v2 verified via apksigner)
- applicationId pt.whatsms.gateway está correcto (não é me.capcom.smsgateway)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 22:34:41 +01:00
ealmeida fff1fc2ab2 fix(colors): adiciona @color/primary referenciada pelo ic_launcher adaptativo
Publish Docs / build (release) Successful in 19s
Release / Build insecure (release) Failing after 3m7s
Release / Build release (release) Failing after 2m53s
Release / release (release) Has been skipped
2026-04-22 21:49:02 +01:00
ealmeida a2f3eb9c96 feat(branding): rebranding WhatSMS + tradução PT-PT
- applicationId: me.capcom.smsgateway → pt.whatsms.gateway
  (namespace Java interno mantido para minimizar risco de refactor)
- app_name: SMSGate → WhatSMS Gateway
- Ícone adaptativo: vector foreground + mipmap-anydpi-v26 copiados do
  whatsms-gateway v2.1 (logo WhatSMS verde)
- ic_launcher_background: #AEADAB → #25D366 (verde WhatSMS)
- values-pt-rPT/strings.xml: tradução completa (~130 strings)

Base branding + PT-PT. Ainda falta:
- Hardcode server URL smsgw.whatsms.pt (Fase 3 do fork)
- SIM selector no UI (Fase 4 do fork)
- Build signed com whatsms-release.jks

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 21:39:55 +01:00
290 changed files with 1384 additions and 7150 deletions
+70
View File
@@ -0,0 +1,70 @@
name: Build AAB — WhatSMS Gateway
on:
push:
branches:
- feat/whatsms-branding-ptpt
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
container:
image: mingc/android-build-box:latest
options: --network host
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configurar JDK 17
run: |
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> $GITHUB_ENV
echo "/usr/lib/jvm/java-17-openjdk-amd64/bin" >> $GITHUB_PATH
java -version
- name: Injectar google-services.json
run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > app/google-services.json
- name: Decode keystore
run: echo '${{ secrets.KEYSTORE_BASE64 }}' | base64 -d > app/keystore.jks
- name: Build AAB release
env:
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
run: |
chmod +x gradlew
./gradlew bundleRelease --no-daemon --stacktrace
- name: Publicar AAB como release Gitea
env:
GITEA_TOKEN: ${{ github.token }}
run: |
AAB=$(find app/build/outputs/bundle/release -name "*.aab" | head -1)
echo "AAB encontrado: $AAB"
# Criar release (ignora erro se tag ja existir)
RESP=$(curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
https://git.descomplicar.pt/api/v1/repos/ealmeida/whatsms-gateway-android/releases \
-d '{"tag_name":"v3.2.0-ci","name":"WhatSMS Gateway v3.2.0 CI","body":"Build automatico Gitea Actions","draft":false,"prerelease":true}')
RELEASE_ID=$(echo "$RESP" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
# Se release ja existe, obter ID por tag
if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then
RELEASE_ID=$(curl -s \
-H "Authorization: token $GITEA_TOKEN" \
https://git.descomplicar.pt/api/v1/repos/ealmeida/whatsms-gateway-android/releases/tags/v3.2.0-ci \
| grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
fi
echo "Release ID: $RELEASE_ID"
# Upload AAB como asset da release
curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/octet-stream" \
--data-binary "@$AAB" \
"https://git.descomplicar.pt/api/v1/repos/ealmeida/whatsms-gateway-android/releases/${RELEASE_ID}/assets?name=whatsms-gateway-v3.2.0.aab"
echo "Upload concluido!"
-49
View File
@@ -1,49 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the Bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Send request to API: [specify endpoint, include payload example]
2. Go to '...'
3. Click on '....'
4. Scroll down to '....'
5. See error
**Expected vs Actual Behavior**
- Expected: A clear and concise description of what you expected to happen.
- Actual: A clear and concise description of what actually happened.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment**
- App Version: [e.g., 1.16.0]
- Mode: [Local, Cloud, Private]
- Operation: [sending/receiving SMS]
- Integration: [e.g., CLI, API, PHP client, etc.]
- Network Type: [WiFi/Mobile Data]
**Smartphone**
- Device: [e.g., Google Pixel]
- OS: [e.g., Android 11]
- SIM Card Count: [e.g., 1 or 2] (Please specify the number of active SIM cards in the device)
**Additional Context**
Add any other context about the problem here, such as log file excerpts.
**Checklist Before Submission**
- [ ] I have described the bug in detail.
- [ ] I have provided the steps to reproduce.
- [ ] I have included screenshots (if applicable).
- [ ] I have provided environment details.
- [ ] I have included relevant log file excerpts (if applicable).
- [ ] I have read [FAQ](https://sms-gate.app/faq/general/) and other relevant information.
-20
View File
@@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
-398
View File
@@ -1,398 +0,0 @@
<a name="readme-top"></a>
<!--
*** Thanks for checking out the Best-README-Template. If you have a suggestion
*** that would make this better, please fork the repo and create a pull request
*** or simply open an issue with the tag "enhancement".
*** Don't forget to give the project a star!
*** Thanks again! Now go create something AMAZING! :D
-->
<!-- PROJECT SHIELDS -->
<!--
*** I'm using markdown "reference style" links for readability.
*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).
*** See the bottom of this document for the declaration of the reference variables
*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.
*** https://www.markdownguide.org/basic-syntax/#reference-style-links
-->
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![Apache 2.0 License][license-shield]][license-url]
<!-- PROJECT LOGO -->
<br />
<div align="center">
<a href="https://github.com/capcom6/android-sms-gateway">
<img src="assets/logo.png" alt="Logo" width="80" height="80">
</a>
<h3 align="center">SMS Gateway for Android™</h3>
<p align="center">
Turns your smartphone into an SMS gateway for sending and receiving messages via API.
<br />
<a href="https://sms-gate.app"><strong>Explore the docs »</strong></a>
<br />
<br />
<!-- <a href="https://github.com/capcom6/android-sms-gateway">View Demo</a> -->
<a href="https://github.com/capcom6/android-sms-gateway/issues">Report Bug</a>
·
<a href="https://github.com/capcom6/android-sms-gateway/issues">Request Feature</a>
</p>
</div>
<!-- TABLE OF CONTENTS -->
- [About The Project](#about-the-project)
- [Features](#features)
- [Ideal For](#ideal-for)
- [Built With](#built-with)
- [Installation](#installation)
- [Build Variants](#build-variants)
- [Prerequisites](#prerequisites)
- [Permissions](#permissions)
- [Installation from APK](#installation-from-apk)
- [Getting Started](#getting-started)
- [Local Server](#local-server)
- [Cloud Server](#cloud-server)
- [Webhooks](#webhooks)
- [Supported Events](#supported-events)
- [Setting Up Webhooks](#setting-up-webhooks)
- [Roadmap](#roadmap)
- [Contributing](#contributing)
- [License](#license)
- [Contact](#contact)
- [Links](#links)
<!-- ABOUT THE PROJECT -->
## About The Project
<p align="center"><img src="assets/screenshot.png" width="360"></p>
SMS Gateway turns your Android smartphone into an SMS gateway. It's a lightweight application that allows you to send SMS messages programmatically via an API or CLI tool and receive webhooks on incoming SMS. This makes it ideal for integrating SMS functionality into your own applications or services.
### Features
📱 Core Functionality:
- 🆓 **No registration required:** No registration or email is required to create an account. In local mode, you don't need an account at all!
- 📨 **Send and Receive SMS via API:** Use [our API](https://docs.sms-gate.app/integration/api/) to send messages directly from your applications or services.
- 🤖 **Support for Android 5.0 and above:** Compatible with Android 5.0 and later versions. [See Android 15 Note](https://docs.sms-gate.app/faq/general/#does-the-app-support-android-15)
💬 Message Handling:
- 📜 **Multipart messages:** Send long messages with auto-partitioning.
- 📊 **Message status tracking:** Monitor the status of sent messages in real-time.
- 📥 **Incoming messages viewer:** View all received SMS, Data SMS, and MMS messages directly in the app with organized tabs and statistics.
- 🔔 **Real-time incoming message notifications:** Receive instant SMS and MMS notifications via webhooks.
- 📖 **Read received messages:** Access [previously received messages](https://docs.sms-gate.app/features/reading-messages/) via the same webhooks used for real-time notifications.
- 📎 **MMS download notifications:** Receive webhook notifications when MMS messages are fully downloaded, including message body and attachments.
🔒 Security and Privacy:
- 🔐 **End-to-end encryption:** Encrypts message content and recipients' phone numbers before sending them to the API and decrypts them on the device.
- 🏢 **Private server support:** Use a backend server in your own infrastructure for enhanced security.
🔧 Advanced Features:
- 💳 **Multiple SIM card support:** Supports devices with [multiple SIM cards](https://docs.sms-gate.app/features/multi-sim/).
- 📱📱 **Multiple device support:** Connect [multiple devices](https://docs.sms-gate.app/features/multi-device/) to the same account with Cloud or Private server. Messages sent via the server are distributed across all connected devices.
- 💾 **Data SMS support:** Send and receive binary [data payloads](https://docs.sms-gate.app/features/data-sms.md) via SMS for IoT commands, encrypted messages, and other specialized use cases.
🔌 Integration:
- 🪝 **Webhooks:** Set up [webhooks](https://docs.sms-gate.app/features/webhooks/) to be triggered on specified events.
### Ideal For
- 🔐 **Authentication & Verification:** Secure user accounts and transactions with SMS-based two-factor authentication, minimizing the risk of unauthorized access.
- 📩 **Transactional Messages:** Send confirmation messages for user actions, enhancing the reliability and perception of your brand.
-**SMS Reminders:** Prompt users about upcoming events or appointments to ensure engagement and reduce missed opportunities.
- 🔔 **SMS Notifications:** Deliver immediate notifications to users for important updates, offers, and service enhancements.
- 📊 **User Feedback:** Solicit and collect user feedback through SMS, providing valuable insights for improving your services.
*Note*: It is not recommended to use this for batch sending due to potential mobile operator restrictions.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
### Built With
- [![Kotlin](https://img.shields.io/badge/Kotlin-000000?style=for-the-badge&logo=kotlin&logoColor=white)](https://kotlinlang.org/)
- [![Ktor](https://img.shields.io/badge/Ktor-000000?style=for-the-badge&logoColor=white)](https://ktor.io/)
- [![Room](https://img.shields.io/badge/Room-000000?style=for-the-badge&logoColor=white)](https://developer.android.com/training/data-storage/room)
- [![Firebase](https://img.shields.io/badge/Firebase-000000?style=for-the-badge&logo=firebase&logoColor=white)](https://firebase.google.com/)
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Installation
You can install app to your device from [prebuilt APK](https://github.com/capcom6/android-sms-gateway/releases).
### Build Variants
The project provides two pre-built variants:
- **Secure (release) build**: Production-ready with strict security configurations. This is the recommended build for production deployments.
- **Insecure build**: For development and testing with cleartext traffic allowed. **This build should never be used in public environments.**
### Prerequisites
You need an Android device with Android 5.0 (Lollipop) or above for using the application.
#### Permissions
To use the application, you need to grant the following permissions:
- **SEND_SMS**: This permission is required to send SMS messages.
- **READ_PHONE_STATE**: This permission is optional. If you want to select the SIM card, you can grant this permission.
- **READ_SMS**: This permission is optional. If you want to read previous SMS messages, you need to grant this permission.
- **RECEIVE_SMS**: This permission is optional. If you want to receive webhooks on incoming SMS, you need to grant this permission.
- **RECEIVE_MMS**, **RECEIVE_WAP_PUSH**: This permissions are optional. If you want to receive webhooks on incoming MMS messages, you need to grant these permissions.
### Installation from APK
1. Navigate to the [Releases](https://github.com/capcom6/android-sms-gateway/releases) page.
2. Download the latest APK file from the list of available releases.
3. Transfer the APK file to your Android device.
4. On your Android device, go to **Settings** > **Security** (or **Privacy** on some devices).
5. Enable the **Unknown sources** option to allow installation of apps from sources other than the Play Store.
6. Use a file manager app to navigate to the location of the downloaded APK file.
7. Tap on the APK file to start the installation process.
8. Follow the on-screen prompts to complete the installation.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- GETTING STARTED -->
## Getting Started
_For integration examples, please refer to the [CLI Tool Documentation](https://sms-gate.app/integration/cli/) and [API Documentation](https://sms-gate.app/integration/api/)_
The SMS Gateway for Android can work in two modes: with a Local Server started on the device or with a Cloud Server. The basic API is the same for both modes and is documented on the [SMS Gateway for Android API Documentation](https://capcom6.github.io/android-sms-gateway/) page.
### Local Server
<div align="center">
<img src="/assets/local-server.png" alt="Local server example settings">
</div>
This mode is ideal for sending messages from a local network.
1. Launch the app on your device.
2. Toggle the `Local Server` switch to the "on" position.
3. Tap the `Offline` button at the bottom of the screen to activate the server.
4. In the `Local Server` section, your device's local and public IP addresses will be displayed, along with the credentials for basic authentication. Note that the public IP address is only accessible if you have a public (or "white") IP and your firewall is configured correctly.
5. To send a message from within the local network, execute a `curl` command like the one below. Replace `<username>`, `<password>`, and `<device_local_ip>` with the actual values provided in the previous step:
```sh
curl -X POST -u <username>:<password> \
-H "Content-Type: application/json" \
-d '{ "textMessage": { "text": "Hello, doctors!" }, "phoneNumbers": ["+19162255887", "+19162255888"] }' \
http://<device_local_ip>:8080/message
```
Alternatively, you can use the CLI Tool:
```sh
smsgate -e 'http://<device_local_ip>:8080/message' -u <username> -p <password> \
send --phones '+19162255887,+19162255888' 'Hello, doctors!'
```
### Cloud Server
<div align="center">
<img src="/assets/cloud-server.png" alt="Cloud server example settings">
</div>
Use the cloud server mode when dealing with dynamic or shared device IP addresses.
1. Launch the app on your device.
2. Toggle the `Cloud Server` switch to the "on" position.
3. Tap the `Online` button located at the bottom of the screen to connect to the cloud server.
4. In the `Cloud Server` section, the credentials for basic authentication will be displayed.
5. To send a message via the cloud server, perform a `curl` request with a command similar to the following, substituting `<username>` and `<password>` with the actual values obtained in step 4:
```sh
curl -X POST -u <username>:<password> \
-H "Content-Type: application/json" \
-d '{ "textMessage": { "text": "Hello, doctors!" }, "phoneNumbers": ["+19162255887", "+19162255888"] }' \
https://api.sms-gate.app/3rdparty/v1/message
```
Or with CLI:
```sh
smsgate -u <username> -p <password> \
send --phones '+19162255887,+19162255888' 'Hello, doctors!'
```
For further privacy, you can deploy your own private server. See the [Private Server](https://sms-gate.app/getting-started/private-server/) section for more details.
### Webhooks
Use webhooks to receive notifications for messaging events (e.g., incoming SMS and MMS).
#### Supported Events
| Event | Description |
| ------------------- | --------------------------------------------------------------------------- |
| `sms:received` | Triggered when an SMS message is received |
| `sms:sent` | Triggered when an SMS message is sent |
| `sms:delivered` | Triggered when an SMS message is delivered |
| `sms:failed` | Triggered when an SMS message fails to send |
| `sms:data-received` | Triggered when a data SMS is received |
| `mms:received` | Triggered when an MMS notification is received (before download) |
| `mms:downloaded` | Triggered when an MMS message is fully downloaded with body and attachments |
| `system:ping` | Periodic heartbeat event |
#### Setting Up Webhooks
Follow these steps to set up webhooks:
1. Set up your own HTTP server with a valid SSL certificate to receive webhooks. For testing purposes, [webhook.site](https://webhook.site) can be useful.
2. Register your webhook with an API request:
```sh
curl -X POST -u <username>:<password> \
-H "Content-Type: application/json" \
-d '{ "id": "unique-id", "url": "https://webhook.site/<your-uuid>", "event": "sms:received" }' \
http://<device_local_ip>:8080/webhooks
```
3. Send an SMS to the device.
4. The application will dispatch POST request to the specified URL with a payload such as:
```json
{
"event": "sms:received",
"payload": {
"messageId": "msg_12345abcde",
"message": "Received SMS text",
"phoneNumber": "+19162255887",
"simNumber": 1,
"receivedAt": "2024-06-07T11:41:31.000+07:00"
}
}
```
5. To deregister a webhook, execute a `curl` request using the following pattern:
```sh
curl -X DELETE -u <username>:<password> \
http://<device_local_ip>:8080/webhooks/unique-id
```
For cloud mode the process is similar, simply change the URL to https://api.sms-gate.app/3rdparty/v1/webhooks. Webhooks in Local and Cloud mode are independent.
*Note*: Webhooks are transmitted directly from the device; therefore, the device must have an outgoing internet connection. As the requests originate from the device, incoming messages remain inaccessible to us.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- ROADMAP -->
## Roadmap
- [x] Add functionality to modify user credentials.
- [x] Introduce option to adjust the local server port.
- [x] Send notifications to an external server when the status of a message changes.
- [ ] Incorporate scheduling capabilities for dispatching messages at specific times.
- [ ] Implement region-based restrictions to prevent international SMS.
- [ ] Provide an API endpoint to retrieve the list of available SIM cards on the device.
- [x] Include detailed error messages in responses and logs.
See the [open issues](https://github.com/capcom6/android-sms-gateway/issues) for a full list of proposed features (and known issues).
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- CONTRIBUTING -->
## Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement".
Don't forget to give the project a star! Thanks again!
1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- LICENSE -->
## License
Distributed under the Apache-2.0 license. See [LICENSE](LICENSE) for more information.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- CONTACT -->
## Contact
If you have any questions or suggestions, feel free to reach out through the following channels:
- **Issue Tracker:** [https://github.com/capcom6/android-sms-gateway/issues](https://github.com/capcom6/android-sms-gateway/issues)
- **Email:** [support@sms-gate.app](mailto:support@sms-gate.app)
- **Discord:** [Join our Discord server](https://discord.gg/vv9raFK4gX)
### Links
- **Website:** [https://sms-gate.app](https://sms-gate.app)
- **Documentation:** [https://docs.sms-gate.app](https://docs.sms-gate.app)
- **Status Page:** [https://status.sms-gate.app](https://status.sms-gate.app)
- **Project:** [https://github.com/android-sms-gateway](https://github.com/android-sms-gateway)
- **Main Repository:** [https://github.com/capcom6/android-sms-gateway](https://github.com/capcom6/android-sms-gateway)
- **Author GitHub:** [capcom6](https://github.com/capcom6)
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- ACKNOWLEDGMENTS -->
<!-- ## Acknowledgments
Use this space to list resources you find helpful and would like to give credit to. I've included a few of my favorites to kick things off!
* [Choose an Open Source License](https://choosealicense.com)
* [GitHub Emoji Cheat Sheet](https://www.webpagefx.com/tools/emoji-cheat-sheet)
* [Malven's Flexbox Cheatsheet](https://flexbox.malven.co/)
* [Malven's Grid Cheatsheet](https://grid.malven.co/)
* [Img Shields](https://shields.io)
* [GitHub Pages](https://pages.github.com)
* [Font Awesome](https://fontawesome.com)
* [React Icons](https://react-icons.github.io/react-icons/search)
<p align="right">(<a href="#readme-top">back to top</a>)</p> -->
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/capcom6/android-sms-gateway.svg?style=for-the-badge
[contributors-url]: https://github.com/capcom6/android-sms-gateway/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/capcom6/android-sms-gateway.svg?style=for-the-badge
[forks-url]: https://github.com/capcom6/android-sms-gateway/network/members
[stars-shield]: https://img.shields.io/github/stars/capcom6/android-sms-gateway.svg?style=for-the-badge
[stars-url]: https://github.com/capcom6/android-sms-gateway/stargazers
[issues-shield]: https://img.shields.io/github/issues/capcom6/android-sms-gateway.svg?style=for-the-badge
[issues-url]: https://github.com/capcom6/android-sms-gateway/issues
[license-shield]: https://img.shields.io/github/license/capcom6/android-sms-gateway.svg?style=for-the-badge
[license-url]: https://github.com/capcom6/android-sms-gateway/blob/master/LICENSE
+9 -6
View File
@@ -6,14 +6,14 @@ plugins {
}
android {
compileSdk 33
compileSdk 34
defaultConfig {
applicationId "me.capcom.smsgateway"
applicationId "pt.whatsms.gateway"
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0.0"
targetSdk 34
versionCode 11
versionName "3.2.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -68,7 +68,7 @@ android {
exclude 'META-INF/INDEX.LIST'
exclude 'META-INF/io.netty.versions.properties'
}
namespace 'me.capcom.smsgateway'
namespace 'pt.whatsms.gateway'
}
dependencies {
@@ -130,6 +130,9 @@ dependencies {
// Koin for Android
implementation "io.insert-koin:koin-android:$koin_version"
// QR code scanner para emparelhamento WhatSMS
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
+1 -1
View File
@@ -4,7 +4,7 @@
"type": "APK",
"kind": "Directory"
},
"applicationId": "me.capcom.smsgateway",
"applicationId": "pt.whatsms.gateway",
"variantName": "release",
"elements": [
{
@@ -1,91 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "67fe481b485f4d2705ab746884ad69b1",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `state` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '67fe481b485f4d2705ab746884ad69b1')"
]
}
}
@@ -1,268 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 10,
"identityHash": "76eadaecfb0d5b84f7038edff0d0a1cf",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_processedAt",
"unique": false,
"columnNames": [
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_processedAt` ON `${TABLE_NAME}` (`processedAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '76eadaecfb0d5b84f7038edff0d0a1cf')"
]
}
}
@@ -1,306 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 11,
"identityHash": "8d650175dcd787e41529e8a5c6327311",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_processedAt",
"unique": false,
"columnNames": [
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_processedAt` ON `${TABLE_NAME}` (`processedAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8d650175dcd787e41529e8a5c6327311')"
]
}
}
@@ -1,366 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 12,
"identityHash": "0bb7c2a525bfb354699c9acfec6fb7a1",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_processedAt",
"unique": false,
"columnNames": [
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_processedAt` ON `${TABLE_NAME}` (`processedAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0bb7c2a525bfb354699c9acfec6fb7a1')"
]
}
}
@@ -1,382 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 13,
"identityHash": "1ef93309ad8e6da02819b46ed75fc050",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `priority` INTEGER NOT NULL DEFAULT 0, `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_state",
"unique": false,
"columnNames": [
"state"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state` ON `${TABLE_NAME}` (`state`)"
},
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_processedAt",
"unique": false,
"columnNames": [
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_processedAt` ON `${TABLE_NAME}` (`processedAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1ef93309ad8e6da02819b46ed75fc050')"
]
}
}
@@ -1,389 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 14,
"identityHash": "b6d02f75a658aca5ece43d2a914dba57",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_state",
"unique": false,
"columnNames": [
"state"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state` ON `${TABLE_NAME}` (`state`)"
},
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_processedAt",
"unique": false,
"columnNames": [
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_processedAt` ON `${TABLE_NAME}` (`processedAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b6d02f75a658aca5ece43d2a914dba57')"
]
}
}
@@ -1,391 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 15,
"identityHash": "e94488261a9a62360b4540f737805373",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_state_processedAt",
"unique": false,
"columnNames": [
"state",
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_processedAt` ON `${TABLE_NAME}` (`state`, `processedAt`)"
},
{
"name": "index_Message_state_createdAt",
"unique": false,
"columnNames": [
"state",
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_createdAt` ON `${TABLE_NAME}` (`state`, `createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e94488261a9a62360b4540f737805373')"
]
}
}
@@ -1,397 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 16,
"identityHash": "c9bca869f0cb40b9f25fbc44308fe786",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `partsCount` INTEGER, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "partsCount",
"columnName": "partsCount",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_state_processedAt",
"unique": false,
"columnNames": [
"state",
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_processedAt` ON `${TABLE_NAME}` (`state`, `processedAt`)"
},
{
"name": "index_Message_state_createdAt",
"unique": false,
"columnNames": [
"state",
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_createdAt` ON `${TABLE_NAME}` (`state`, `createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c9bca869f0cb40b9f25fbc44308fe786')"
]
}
}
@@ -1,482 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 17,
"identityHash": "e647a679fe74540d36be13c53eadc9cb",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `partsCount` INTEGER, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "partsCount",
"columnName": "partsCount",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_state_processedAt",
"unique": false,
"columnNames": [
"state",
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_processedAt` ON `${TABLE_NAME}` (`state`, `processedAt`)"
},
{
"name": "index_Message_state_createdAt",
"unique": false,
"columnNames": [
"state",
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_createdAt` ON `${TABLE_NAME}` (`state`, `createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "webhook_queue",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `payload` TEXT NOT NULL, `retry_count` INTEGER NOT NULL DEFAULT 0, `status` TEXT NOT NULL DEFAULT 'pending', `created_at` INTEGER NOT NULL, `next_attempt` INTEGER NOT NULL, `last_error` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "payload",
"columnName": "payload",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "retryCount",
"columnName": "retry_count",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'pending'"
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "nextAttempt",
"columnName": "next_attempt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastError",
"columnName": "last_error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_webhook_queue_status_next_attempt",
"unique": false,
"columnNames": [
"status",
"next_attempt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_next_attempt` ON `${TABLE_NAME}` (`status`, `next_attempt`)"
},
{
"name": "index_webhook_queue_status_created_at",
"unique": false,
"columnNames": [
"status",
"created_at"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_created_at` ON `${TABLE_NAME}` (`status`, `created_at`)"
}
],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e647a679fe74540d36be13c53eadc9cb')"
]
}
}
@@ -1,524 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 18,
"identityHash": "b001a953ad105f209e7c4a05c2f4c3ff",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `partsCount` INTEGER, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "partsCount",
"columnName": "partsCount",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_state_processedAt",
"unique": false,
"columnNames": [
"state",
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_processedAt` ON `${TABLE_NAME}` (`state`, `processedAt`)"
},
{
"name": "index_Message_state_createdAt",
"unique": false,
"columnNames": [
"state",
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_createdAt` ON `${TABLE_NAME}` (`state`, `createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "webhook_queue",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `payload` TEXT NOT NULL, `retry_count` INTEGER NOT NULL DEFAULT 0, `status` TEXT NOT NULL DEFAULT 'pending', `created_at` INTEGER NOT NULL, `next_attempt` INTEGER NOT NULL, `last_error` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "payload",
"columnName": "payload",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "retryCount",
"columnName": "retry_count",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'pending'"
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "nextAttempt",
"columnName": "next_attempt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastError",
"columnName": "last_error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_webhook_queue_status_next_attempt",
"unique": false,
"columnNames": [
"status",
"next_attempt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_next_attempt` ON `${TABLE_NAME}` (`status`, `next_attempt`)"
},
{
"name": "index_webhook_queue_status_created_at",
"unique": false,
"columnNames": [
"status",
"created_at"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_created_at` ON `${TABLE_NAME}` (`status`, `created_at`)"
}
],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "tokens",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `expiresAt` INTEGER NOT NULL, `revokedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "expiresAt",
"columnName": "expiresAt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "revokedAt",
"columnName": "revokedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_tokens_expiresAt",
"unique": false,
"columnNames": [
"expiresAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_tokens_expiresAt` ON `${TABLE_NAME}` (`expiresAt`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b001a953ad105f209e7c4a05c2f4c3ff')"
]
}
}
@@ -1,605 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 19,
"identityHash": "ea9afd972e8ac233d6efa55d7cc8109b",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `partsCount` INTEGER, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "partsCount",
"columnName": "partsCount",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_state_processedAt",
"unique": false,
"columnNames": [
"state",
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_processedAt` ON `${TABLE_NAME}` (`state`, `processedAt`)"
},
{
"name": "index_Message_state_createdAt",
"unique": false,
"columnNames": [
"state",
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_createdAt` ON `${TABLE_NAME}` (`state`, `createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "webhook_queue",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `payload` TEXT NOT NULL, `retry_count` INTEGER NOT NULL DEFAULT 0, `status` TEXT NOT NULL DEFAULT 'pending', `created_at` INTEGER NOT NULL, `next_attempt` INTEGER NOT NULL, `last_error` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "payload",
"columnName": "payload",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "retryCount",
"columnName": "retry_count",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'pending'"
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "nextAttempt",
"columnName": "next_attempt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastError",
"columnName": "last_error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_webhook_queue_status_next_attempt",
"unique": false,
"columnNames": [
"status",
"next_attempt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_next_attempt` ON `${TABLE_NAME}` (`status`, `next_attempt`)"
},
{
"name": "index_webhook_queue_status_created_at",
"unique": false,
"columnNames": [
"status",
"created_at"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_created_at` ON `${TABLE_NAME}` (`status`, `created_at`)"
}
],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "tokens",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `expiresAt` INTEGER NOT NULL, `revokedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "expiresAt",
"columnName": "expiresAt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "revokedAt",
"columnName": "revokedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_tokens_expiresAt",
"unique": false,
"columnNames": [
"expiresAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_tokens_expiresAt` ON `${TABLE_NAME}` (`expiresAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "incoming_messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` TEXT NOT NULL, `sender` TEXT NOT NULL, `recipient` TEXT, `simNumber` INTEGER, `subscriptionId` INTEGER, `contentPreview` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "sender",
"columnName": "sender",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "recipient",
"columnName": "recipient",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "contentPreview",
"columnName": "contentPreview",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_incoming_messages_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_incoming_messages_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_incoming_messages_type",
"unique": false,
"columnNames": [
"type"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_incoming_messages_type` ON `${TABLE_NAME}` (`type`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ea9afd972e8ac233d6efa55d7cc8109b')"
]
}
}
@@ -1,98 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "1c3c3246ea0f368ec95b740b2f50e18b",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1c3c3246ea0f368ec95b740b2f50e18b')"
]
}
}
@@ -1,605 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 20,
"identityHash": "b746d44a36cc274b009e421faa9c96ee",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `type` TEXT NOT NULL DEFAULT 'Text', `content` TEXT NOT NULL, `state` TEXT NOT NULL, `partsCount` INTEGER, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Text'"
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "partsCount",
"columnName": "partsCount",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_state_processedAt",
"unique": false,
"columnNames": [
"state",
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_processedAt` ON `${TABLE_NAME}` (`state`, `processedAt`)"
},
{
"name": "index_Message_state_createdAt",
"unique": false,
"columnNames": [
"state",
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_state_createdAt` ON `${TABLE_NAME}` (`state`, `createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "RecipientState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`, `state`), FOREIGN KEY(`messageId`, `phoneNumber`) REFERENCES `MessageRecipient`(`messageId`, `phoneNumber`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "MessageRecipient",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId",
"phoneNumber"
],
"referencedColumns": [
"messageId",
"phoneNumber"
]
}
]
},
{
"tableName": "MessageState",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `state` TEXT NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`messageId`, `state`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"state"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "WebHook",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `event` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "event",
"columnName": "event",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "webhook_queue",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `payload` TEXT NOT NULL, `retry_count` INTEGER NOT NULL DEFAULT 0, `status` TEXT NOT NULL DEFAULT 'pending', `created_at` INTEGER NOT NULL, `next_attempt` INTEGER NOT NULL, `last_error` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "payload",
"columnName": "payload",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "retryCount",
"columnName": "retry_count",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'pending'"
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "nextAttempt",
"columnName": "next_attempt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastError",
"columnName": "last_error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_webhook_queue_status_next_attempt",
"unique": false,
"columnNames": [
"status",
"next_attempt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_next_attempt` ON `${TABLE_NAME}` (`status`, `next_attempt`)"
},
{
"name": "index_webhook_queue_status_created_at",
"unique": false,
"columnNames": [
"status",
"created_at"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_webhook_queue_status_created_at` ON `${TABLE_NAME}` (`status`, `created_at`)"
}
],
"foreignKeys": []
},
{
"tableName": "logs_entries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`priority` TEXT NOT NULL, `module` TEXT NOT NULL, `message` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `context` TEXT, `createdAt` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "priority",
"columnName": "priority",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "module",
"columnName": "module",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "context",
"columnName": "context",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_logs_entries_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_logs_entries_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "tokens",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `expiresAt` INTEGER NOT NULL, `revokedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "expiresAt",
"columnName": "expiresAt",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "revokedAt",
"columnName": "revokedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_tokens_expiresAt",
"unique": false,
"columnNames": [
"expiresAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_tokens_expiresAt` ON `${TABLE_NAME}` (`expiresAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "incoming_messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` TEXT NOT NULL, `sender` TEXT NOT NULL, `recipient` TEXT, `simNumber` INTEGER, `subscriptionId` INTEGER, `contentPreview` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "sender",
"columnName": "sender",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "recipient",
"columnName": "recipient",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "contentPreview",
"columnName": "contentPreview",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_incoming_messages_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_incoming_messages_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_incoming_messages_type",
"unique": false,
"columnNames": [
"type"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_incoming_messages_type` ON `${TABLE_NAME}` (`type`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b746d44a36cc274b009e421faa9c96ee')"
]
}
}
@@ -1,105 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 3,
"identityHash": "89b4d1142a9c77effbb234879f4b540a",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '89b4d1142a9c77effbb234879f4b540a')"
]
}
}
@@ -1,111 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 4,
"identityHash": "e4a0450ae2b806b52bfbcd2456501a1d",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e4a0450ae2b806b52bfbcd2456501a1d')"
]
}
}
@@ -1,118 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 5,
"identityHash": "4a86263b9bb6a736271cc66c6faca254",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `createdAt` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4a86263b9bb6a736271cc66c6faca254')"
]
}
}
@@ -1,137 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 6,
"identityHash": "c85c71171bb3e9eb347615dd91e7ae82",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `state` TEXT NOT NULL, `source` TEXT NOT NULL DEFAULT 'Local', `createdAt` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c85c71171bb3e9eb347615dd91e7ae82')"
]
}
}
@@ -1,144 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 7,
"identityHash": "0638620d8ed8717433cb8e718cfc4646",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0638620d8ed8717433cb8e718cfc4646')"
]
}
}
@@ -1,144 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 8,
"identityHash": "0638620d8ed8717433cb8e718cfc4646",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0638620d8ed8717433cb8e718cfc4646')"
]
}
}
@@ -1,169 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 9,
"identityHash": "bfb73410aeb4903b9ea559c1b60bd8e3",
"entities": [
{
"tableName": "Message",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `withDeliveryReport` INTEGER NOT NULL DEFAULT 1, `simNumber` INTEGER, `validUntil` TEXT, `isEncrypted` INTEGER NOT NULL DEFAULT 0, `skipPhoneValidation` INTEGER NOT NULL DEFAULT 0, `source` TEXT NOT NULL DEFAULT 'Local', `state` TEXT NOT NULL, `createdAt` INTEGER NOT NULL DEFAULT 0, `processedAt` INTEGER, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "withDeliveryReport",
"columnName": "withDeliveryReport",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "1"
},
{
"fieldPath": "simNumber",
"columnName": "simNumber",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "validUntil",
"columnName": "validUntil",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isEncrypted",
"columnName": "isEncrypted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "skipPhoneValidation",
"columnName": "skipPhoneValidation",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true,
"defaultValue": "'Local'"
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "createdAt",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "processedAt",
"columnName": "processedAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_Message_createdAt",
"unique": false,
"columnNames": [
"createdAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_createdAt` ON `${TABLE_NAME}` (`createdAt`)"
},
{
"name": "index_Message_processedAt",
"unique": false,
"columnNames": [
"processedAt"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Message_processedAt` ON `${TABLE_NAME}` (`processedAt`)"
}
],
"foreignKeys": []
},
{
"tableName": "MessageRecipient",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `phoneNumber` TEXT NOT NULL, `state` TEXT NOT NULL, `error` TEXT, PRIMARY KEY(`messageId`, `phoneNumber`), FOREIGN KEY(`messageId`) REFERENCES `Message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "phoneNumber",
"columnName": "phoneNumber",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"phoneNumber"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "Message",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bfb73410aeb4903b9ea559c1b60bd8e3')"
]
}
}
@@ -0,0 +1 @@
ewogICJmb3JtYXRWZXJzaW9uIjogMSwKICAiZGF0YWJhc2UiOiB7CiAgICAidmVyc2lvbiI6IDEsCiAgICAiaWRlbnRpdHlIYXNoIjogIjY3ZmU0ODFiNDg1ZjRkMjcwNWFiNzQ2ODg0YWQ2OWIxIiwKICAgICJlbnRpdGllcyI6IFsKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZSIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBpZGAgVEVYVCBOT1QgTlVMTCwgYHRleHRgIFRFWFQgTk9UIE5VTEwsIGBzdGF0ZWAgVEVYVCBOT1QgTlVMTCwgUFJJTUFSWSBLRVkoYGlkYCkpIiwKICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogImlkIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAiaWQiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJ0ZXh0IiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAidGV4dCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInN0YXRlIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAic3RhdGUiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInByaW1hcnlLZXkiOiB7CiAgICAgICAgICAiY29sdW1uTmFtZXMiOiBbCiAgICAgICAgICAgICJpZCIKICAgICAgICAgIF0sCiAgICAgICAgICAiYXV0b0dlbmVyYXRlIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJpbmRpY2VzIjogW10sCiAgICAgICAgImZvcmVpZ25LZXlzIjogW10KICAgICAgfSwKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZVJlY2lwaWVudCIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBtZXNzYWdlSWRgIFRFWFQgTk9UIE5VTEwsIGBwaG9uZU51bWJlcmAgVEVYVCBOT1QgTlVMTCwgYHN0YXRlYCBURVhUIE5PVCBOVUxMLCBQUklNQVJZIEtFWShgbWVzc2FnZUlkYCwgYHBob25lTnVtYmVyYCksIEZPUkVJR04gS0VZKGBtZXNzYWdlSWRgKSBSRUZFUkVOQ0VTIGBNZXNzYWdlYChgaWRgKSBPTiBVUERBVEUgTk8gQUNUSU9OIE9OIERFTEVURSBDQVNDQURFICkiLAogICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAibWVzc2FnZUlkIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAibWVzc2FnZUlkIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAicGhvbmVOdW1iZXIiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJwaG9uZU51bWJlciIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInN0YXRlIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAic3RhdGUiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInByaW1hcnlLZXkiOiB7CiAgICAgICAgICAiY29sdW1uTmFtZXMiOiBbCiAgICAgICAgICAgICJtZXNzYWdlSWQiLAogICAgICAgICAgICAicGhvbmVOdW1iZXIiCiAgICAgICAgICBdLAogICAgICAgICAgImF1dG9HZW5lcmF0ZSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiaW5kaWNlcyI6IFtdLAogICAgICAgICJmb3JlaWduS2V5cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgInRhYmxlIjogIk1lc3NhZ2UiLAogICAgICAgICAgICAib25EZWxldGUiOiAiQ0FTQ0FERSIsCiAgICAgICAgICAgICJvblVwZGF0ZSI6ICJOTyBBQ1RJT04iLAogICAgICAgICAgICAiY29sdW1ucyI6IFsKICAgICAgICAgICAgICAibWVzc2FnZUlkIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVmZXJlbmNlZENvbHVtbnMiOiBbCiAgICAgICAgICAgICAgImlkIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9CiAgICBdLAogICAgInZpZXdzIjogW10sCiAgICAic2V0dXBRdWVyaWVzIjogWwogICAgICAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgcm9vbV9tYXN0ZXJfdGFibGUgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksaWRlbnRpdHlfaGFzaCBURVhUKSIsCiAgICAgICJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHJvb21fbWFzdGVyX3RhYmxlIChpZCxpZGVudGl0eV9oYXNoKSBWQUxVRVMoNDIsICc2N2ZlNDgxYjQ4NWY0ZDI3MDVhYjc0Njg4NGFkNjliMScpIgogICAgXQogIH0KfQ==
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
ewogICJmb3JtYXRWZXJzaW9uIjogMSwKICAiZGF0YWJhc2UiOiB7CiAgICAidmVyc2lvbiI6IDIsCiAgICAiaWRlbnRpdHlIYXNoIjogIjFjM2MzMjQ2ZWEwZjM2OGVjOTViNzQwYjJmNTBlMThiIiwKICAgICJlbnRpdGllcyI6IFsKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZSIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBpZGAgVEVYVCBOT1QgTlVMTCwgYHRleHRgIFRFWFQgTk9UIE5VTEwsIGBzb3VyY2VgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnTG9jYWwnLCBgc3RhdGVgIFRFWFQgTk9UIE5VTEwsIFBSSU1BUlkgS0VZKGBpZGApKSIsCiAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJpZCIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogImlkIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAidGV4dCIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogInRleHQiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJzb3VyY2UiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJzb3VyY2UiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZSwKICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSI6ICInTG9jYWwnIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogInN0YXRlIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJwcmltYXJ5S2V5IjogewogICAgICAgICAgImNvbHVtbk5hbWVzIjogWwogICAgICAgICAgICAiaWQiCiAgICAgICAgICBdLAogICAgICAgICAgImF1dG9HZW5lcmF0ZSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiaW5kaWNlcyI6IFtdLAogICAgICAgICJmb3JlaWduS2V5cyI6IFtdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAidGFibGVOYW1lIjogIk1lc3NhZ2VSZWNpcGllbnQiLAogICAgICAgICJjcmVhdGVTcWwiOiAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYCR7VEFCTEVfTkFNRX1gIChgbWVzc2FnZUlkYCBURVhUIE5PVCBOVUxMLCBgcGhvbmVOdW1iZXJgIFRFWFQgTk9UIE5VTEwsIGBzdGF0ZWAgVEVYVCBOT1QgTlVMTCwgUFJJTUFSWSBLRVkoYG1lc3NhZ2VJZGAsIGBwaG9uZU51bWJlcmApLCBGT1JFSUdOIEtFWShgbWVzc2FnZUlkYCkgUkVGRVJFTkNFUyBgTWVzc2FnZWAoYGlkYCkgT04gVVBEQVRFIE5PIEFDVElPTiBPTiBERUxFVEUgQ0FTQ0FERSApIiwKICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogIm1lc3NhZ2VJZCIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogIm1lc3NhZ2VJZCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInBob25lTnVtYmVyIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAicGhvbmVOdW1iZXIiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogInN0YXRlIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJwcmltYXJ5S2V5IjogewogICAgICAgICAgImNvbHVtbk5hbWVzIjogWwogICAgICAgICAgICAibWVzc2FnZUlkIiwKICAgICAgICAgICAgInBob25lTnVtYmVyIgogICAgICAgICAgXSwKICAgICAgICAgICJhdXRvR2VuZXJhdGUiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgImluZGljZXMiOiBbXSwKICAgICAgICAiZm9yZWlnbktleXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJ0YWJsZSI6ICJNZXNzYWdlIiwKICAgICAgICAgICAgIm9uRGVsZXRlIjogIkNBU0NBREUiLAogICAgICAgICAgICAib25VcGRhdGUiOiAiTk8gQUNUSU9OIiwKICAgICAgICAgICAgImNvbHVtbnMiOiBbCiAgICAgICAgICAgICAgIm1lc3NhZ2VJZCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInJlZmVyZW5jZWRDb2x1bW5zIjogWwogICAgICAgICAgICAgICJpZCIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfQogICAgXSwKICAgICJ2aWV3cyI6IFtdLAogICAgInNldHVwUXVlcmllcyI6IFsKICAgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHJvb21fbWFzdGVyX3RhYmxlIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLGlkZW50aXR5X2hhc2ggVEVYVCkiLAogICAgICAiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyByb29tX21hc3Rlcl90YWJsZSAoaWQsaWRlbnRpdHlfaGFzaCkgVkFMVUVTKDQyLCAnMWMzYzMyNDZlYTBmMzY4ZWM5NWI3NDBiMmY1MGUxOGInKSIKICAgIF0KICB9Cn0=
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
ewogICJmb3JtYXRWZXJzaW9uIjogMSwKICAiZGF0YWJhc2UiOiB7CiAgICAidmVyc2lvbiI6IDMsCiAgICAiaWRlbnRpdHlIYXNoIjogIjg5YjRkMTE0MmE5Yzc3ZWZmYmIyMzQ4NzlmNGI1NDBhIiwKICAgICJlbnRpdGllcyI6IFsKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZSIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBpZGAgVEVYVCBOT1QgTlVMTCwgYHRleHRgIFRFWFQgTk9UIE5VTEwsIGBzb3VyY2VgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnTG9jYWwnLCBgc3RhdGVgIFRFWFQgTk9UIE5VTEwsIGBjcmVhdGVkQXRgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCBQUklNQVJZIEtFWShgaWRgKSkiLAogICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAiaWQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJpZCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInRleHQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic291cmNlIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAic291cmNlIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUsCiAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiOiAiJ0xvY2FsJyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic3RhdGUiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogImNyZWF0ZWRBdCIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogImNyZWF0ZWRBdCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJJTlRFR0VSIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlLAogICAgICAgICAgICAiZGVmYXVsdFZhbHVlIjogIjAiCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicHJpbWFyeUtleSI6IHsKICAgICAgICAgICJjb2x1bW5OYW1lcyI6IFsKICAgICAgICAgICAgImlkIgogICAgICAgICAgXSwKICAgICAgICAgICJhdXRvR2VuZXJhdGUiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgImluZGljZXMiOiBbXSwKICAgICAgICAiZm9yZWlnbktleXMiOiBbXQogICAgICB9LAogICAgICB7CiAgICAgICAgInRhYmxlTmFtZSI6ICJNZXNzYWdlUmVjaXBpZW50IiwKICAgICAgICAiY3JlYXRlU3FsIjogIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGAke1RBQkxFX05BTUV9YCAoYG1lc3NhZ2VJZGAgVEVYVCBOT1QgTlVMTCwgYHBob25lTnVtYmVyYCBURVhUIE5PVCBOVUxMLCBgc3RhdGVgIFRFWFQgTk9UIE5VTEwsIFBSSU1BUlkgS0VZKGBtZXNzYWdlSWRgLCBgcGhvbmVOdW1iZXJgKSwgRk9SRUlHTiBLRVkoYG1lc3NhZ2VJZGApIFJFRkVSRU5DRVMgYE1lc3NhZ2VgKGBpZGApIE9OIFVQREFURSBOTyBBQ1RJT04gT04gREVMRVRFIENBU0NBREUgKSIsCiAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJtZXNzYWdlSWQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJtZXNzYWdlSWQiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJwaG9uZU51bWJlciIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogInBob25lTnVtYmVyIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic3RhdGUiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicHJpbWFyeUtleSI6IHsKICAgICAgICAgICJjb2x1bW5OYW1lcyI6IFsKICAgICAgICAgICAgIm1lc3NhZ2VJZCIsCiAgICAgICAgICAgICJwaG9uZU51bWJlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiYXV0b0dlbmVyYXRlIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJpbmRpY2VzIjogW10sCiAgICAgICAgImZvcmVpZ25LZXlzIjogWwogICAgICAgICAgewogICAgICAgICAgICAidGFibGUiOiAiTWVzc2FnZSIsCiAgICAgICAgICAgICJvbkRlbGV0ZSI6ICJDQVNDQURFIiwKICAgICAgICAgICAgIm9uVXBkYXRlIjogIk5PIEFDVElPTiIsCiAgICAgICAgICAgICJjb2x1bW5zIjogWwogICAgICAgICAgICAgICJtZXNzYWdlSWQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJyZWZlcmVuY2VkQ29sdW1ucyI6IFsKICAgICAgICAgICAgICAiaWQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0KICAgIF0sCiAgICAidmlld3MiOiBbXSwKICAgICJzZXR1cFF1ZXJpZXMiOiBbCiAgICAgICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyByb29tX21hc3Rlcl90YWJsZSAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSxpZGVudGl0eV9oYXNoIFRFWFQpIiwKICAgICAgIklOU0VSVCBPUiBSRVBMQUNFIElOVE8gcm9vbV9tYXN0ZXJfdGFibGUgKGlkLGlkZW50aXR5X2hhc2gpIFZBTFVFUyg0MiwgJzg5YjRkMTE0MmE5Yzc3ZWZmYmIyMzQ4NzlmNGI1NDBhJykiCiAgICBdCiAgfQp9
@@ -0,0 +1 @@
ewogICJmb3JtYXRWZXJzaW9uIjogMSwKICAiZGF0YWJhc2UiOiB7CiAgICAidmVyc2lvbiI6IDQsCiAgICAiaWRlbnRpdHlIYXNoIjogImU0YTA0NTBhZTJiODA2YjUyYmZiY2QyNDU2NTAxYTFkIiwKICAgICJlbnRpdGllcyI6IFsKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZSIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBpZGAgVEVYVCBOT1QgTlVMTCwgYHRleHRgIFRFWFQgTk9UIE5VTEwsIGBzb3VyY2VgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnTG9jYWwnLCBgc3RhdGVgIFRFWFQgTk9UIE5VTEwsIGBjcmVhdGVkQXRgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCBQUklNQVJZIEtFWShgaWRgKSkiLAogICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAiaWQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJpZCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInRleHQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic291cmNlIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAic291cmNlIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUsCiAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiOiAiJ0xvY2FsJyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic3RhdGUiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogImNyZWF0ZWRBdCIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogImNyZWF0ZWRBdCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJJTlRFR0VSIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlLAogICAgICAgICAgICAiZGVmYXVsdFZhbHVlIjogIjAiCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicHJpbWFyeUtleSI6IHsKICAgICAgICAgICJjb2x1bW5OYW1lcyI6IFsKICAgICAgICAgICAgImlkIgogICAgICAgICAgXSwKICAgICAgICAgICJhdXRvR2VuZXJhdGUiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgImluZGljZXMiOiBbXSwKICAgICAgICAiZm9yZWlnbktleXMiOiBbXQogICAgICB9LAogICAgICB7CiAgICAgICAgInRhYmxlTmFtZSI6ICJNZXNzYWdlUmVjaXBpZW50IiwKICAgICAgICAiY3JlYXRlU3FsIjogIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGAke1RBQkxFX05BTUV9YCAoYG1lc3NhZ2VJZGAgVEVYVCBOT1QgTlVMTCwgYHBob25lTnVtYmVyYCBURVhUIE5PVCBOVUxMLCBgc3RhdGVgIFRFWFQgTk9UIE5VTEwsIGBlcnJvcmAgVEVYVCwgUFJJTUFSWSBLRVkoYG1lc3NhZ2VJZGAsIGBwaG9uZU51bWJlcmApLCBGT1JFSUdOIEtFWShgbWVzc2FnZUlkYCkgUkVGRVJFTkNFUyBgTWVzc2FnZWAoYGlkYCkgT04gVVBEQVRFIE5PIEFDVElPTiBPTiBERUxFVEUgQ0FTQ0FERSApIiwKICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogIm1lc3NhZ2VJZCIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogIm1lc3NhZ2VJZCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInBob25lTnVtYmVyIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAicGhvbmVOdW1iZXIiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogInN0YXRlIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAiZXJyb3IiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJlcnJvciIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiBmYWxzZQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInByaW1hcnlLZXkiOiB7CiAgICAgICAgICAiY29sdW1uTmFtZXMiOiBbCiAgICAgICAgICAgICJtZXNzYWdlSWQiLAogICAgICAgICAgICAicGhvbmVOdW1iZXIiCiAgICAgICAgICBdLAogICAgICAgICAgImF1dG9HZW5lcmF0ZSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiaW5kaWNlcyI6IFtdLAogICAgICAgICJmb3JlaWduS2V5cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgInRhYmxlIjogIk1lc3NhZ2UiLAogICAgICAgICAgICAib25EZWxldGUiOiAiQ0FTQ0FERSIsCiAgICAgICAgICAgICJvblVwZGF0ZSI6ICJOTyBBQ1RJT04iLAogICAgICAgICAgICAiY29sdW1ucyI6IFsKICAgICAgICAgICAgICAibWVzc2FnZUlkIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVmZXJlbmNlZENvbHVtbnMiOiBbCiAgICAgICAgICAgICAgImlkIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9CiAgICBdLAogICAgInZpZXdzIjogW10sCiAgICAic2V0dXBRdWVyaWVzIjogWwogICAgICAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgcm9vbV9tYXN0ZXJfdGFibGUgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksaWRlbnRpdHlfaGFzaCBURVhUKSIsCiAgICAgICJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHJvb21fbWFzdGVyX3RhYmxlIChpZCxpZGVudGl0eV9oYXNoKSBWQUxVRVMoNDIsICdlNGEwNDUwYWUyYjgwNmI1MmJmYmNkMjQ1NjUwMWExZCcpIgogICAgXQogIH0KfQ==
@@ -0,0 +1 @@
ewogICJmb3JtYXRWZXJzaW9uIjogMSwKICAiZGF0YWJhc2UiOiB7CiAgICAidmVyc2lvbiI6IDUsCiAgICAiaWRlbnRpdHlIYXNoIjogIjRhODYyNjNiOWJiNmE3MzYyNzFjYzY2YzZmYWNhMjU0IiwKICAgICJlbnRpdGllcyI6IFsKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZSIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBpZGAgVEVYVCBOT1QgTlVMTCwgYHRleHRgIFRFWFQgTk9UIE5VTEwsIGBzb3VyY2VgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnTG9jYWwnLCBgc3RhdGVgIFRFWFQgTk9UIE5VTEwsIGBpc0VuY3J5cHRlZGAgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsIGBjcmVhdGVkQXRgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCBQUklNQVJZIEtFWShgaWRgKSkiLAogICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAiaWQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJpZCIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogInRleHQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic291cmNlIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAic291cmNlIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUsCiAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiOiAiJ0xvY2FsJyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic3RhdGUiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogImlzRW5jcnlwdGVkIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAiaXNFbmNyeXB0ZWQiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiSU5URUdFUiIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZSwKICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSI6ICIwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJjcmVhdGVkQXQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJjcmVhdGVkQXQiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiSU5URUdFUiIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZSwKICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSI6ICIwIgogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInByaW1hcnlLZXkiOiB7CiAgICAgICAgICAiY29sdW1uTmFtZXMiOiBbCiAgICAgICAgICAgICJpZCIKICAgICAgICAgIF0sCiAgICAgICAgICAiYXV0b0dlbmVyYXRlIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJpbmRpY2VzIjogW10sCiAgICAgICAgImZvcmVpZ25LZXlzIjogW10KICAgICAgfSwKICAgICAgewogICAgICAgICJ0YWJsZU5hbWUiOiAiTWVzc2FnZVJlY2lwaWVudCIsCiAgICAgICAgImNyZWF0ZVNxbCI6ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgJHtUQUJMRV9OQU1FfWAgKGBtZXNzYWdlSWRgIFRFWFQgTk9UIE5VTEwsIGBwaG9uZU51bWJlcmAgVEVYVCBOT1QgTlVMTCwgYHN0YXRlYCBURVhUIE5PVCBOVUxMLCBgZXJyb3JgIFRFWFQsIFBSSU1BUlkgS0VZKGBtZXNzYWdlSWRgLCBgcGhvbmVOdW1iZXJgKSwgRk9SRUlHTiBLRVkoYG1lc3NhZ2VJZGApIFJFRkVSRU5DRVMgYE1lc3NhZ2VgKGBpZGApIE9OIFVQREFURSBOTyBBQ1RJT04gT04gREVMRVRFIENBU0NBREUgKSIsCiAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJtZXNzYWdlSWQiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJtZXNzYWdlSWQiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImZpZWxkUGF0aCI6ICJwaG9uZU51bWJlciIsCiAgICAgICAgICAgICJjb2x1bW5OYW1lIjogInBob25lTnVtYmVyIiwKICAgICAgICAgICAgImFmZmluaXR5IjogIlRFWFQiLAogICAgICAgICAgICAibm90TnVsbCI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJmaWVsZFBhdGgiOiAic3RhdGUiLAogICAgICAgICAgICAiY29sdW1uTmFtZSI6ICJzdGF0ZSIsCiAgICAgICAgICAgICJhZmZpbml0eSI6ICJURVhUIiwKICAgICAgICAgICAgIm5vdE51bGwiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZmllbGRQYXRoIjogImVycm9yIiwKICAgICAgICAgICAgImNvbHVtbk5hbWUiOiAiZXJyb3IiLAogICAgICAgICAgICAiYWZmaW5pdHkiOiAiVEVYVCIsCiAgICAgICAgICAgICJub3ROdWxsIjogZmFsc2UKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJwcmltYXJ5S2V5IjogewogICAgICAgICAgImNvbHVtbk5hbWVzIjogWwogICAgICAgICAgICAibWVzc2FnZUlkIiwKICAgICAgICAgICAgInBob25lTnVtYmVyIgogICAgICAgICAgXSwKICAgICAgICAgICJhdXRvR2VuZXJhdGUiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgImluZGljZXMiOiBbXSwKICAgICAgICAiZm9yZWlnbktleXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJ0YWJsZSI6ICJNZXNzYWdlIiwKICAgICAgICAgICAgIm9uRGVsZXRlIjogIkNBU0NBREUiLAogICAgICAgICAgICAib25VcGRhdGUiOiAiTk8gQUNUSU9OIiwKICAgICAgICAgICAgImNvbHVtbnMiOiBbCiAgICAgICAgICAgICAgIm1lc3NhZ2VJZCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInJlZmVyZW5jZWRDb2x1bW5zIjogWwogICAgICAgICAgICAgICJpZCIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfQogICAgXSwKICAgICJ2aWV3cyI6IFtdLAogICAgInNldHVwUXVlcmllcyI6IFsKICAgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHJvb21fbWFzdGVyX3RhYmxlIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLGlkZW50aXR5X2hhc2ggVEVYVCkiLAogICAgICAiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyByb29tX21hc3Rlcl90YWJsZSAoaWQsaWRlbnRpdHlfaGFzaCkgVkFMVUVTKDQyLCAnNGE4NjI2M2I5YmI2YTczNjI3MWNjNjZjNmZhY2EyNTQnKSIKICAgIF0KICB9Cn0=
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
package me.capcom.smsgateway
package pt.whatsms.gateway
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
@@ -17,6 +17,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("me.capcom.smsgateway", appContext.packageName)
assertEquals("pt.whatsms.gateway", appContext.packageName)
}
}
+10 -4
View File
@@ -4,12 +4,14 @@
<uses-feature
android:name="android.hardware.telephony"
android:required="true" />
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@@ -54,8 +56,8 @@
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="me.capcom.smsgateway.ACTION_SENT" />
<action android:name="me.capcom.smsgateway.ACTION_DELIVERED" />
<action android:name="pt.whatsms.gateway.ACTION_SENT" />
<action android:name="pt.whatsms.gateway.ACTION_DELIVERED" />
</intent-filter>
</receiver>
<receiver
@@ -83,6 +85,10 @@
android:foregroundServiceType="dataSync"
tools:node="merge" />
<activity
android:name=".ui.ScanPairingActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
@@ -1,31 +0,0 @@
package me.capcom.smsgateway.data.entities
import androidx.room.ColumnInfo
import androidx.room.Embedded
import androidx.room.Relation
data class MessageWithRecipients(
@Embedded val message: Message,
@Relation(
parentColumn = "id",
entityColumn = "messageId",
)
val recipients: List<MessageRecipient>,
@Relation(
parentColumn = "id",
entityColumn = "messageId",
)
val states: List<MessageState> = emptyList(),
@ColumnInfo(name = "rowid")
val rowId: Long = 0,
) {
val state: me.capcom.smsgateway.domain.ProcessingState
get() = when {
recipients.any { it.state == me.capcom.smsgateway.domain.ProcessingState.Pending } -> me.capcom.smsgateway.domain.ProcessingState.Pending
recipients.any { it.state == me.capcom.smsgateway.domain.ProcessingState.Processed } -> me.capcom.smsgateway.domain.ProcessingState.Processed
recipients.all { it.state == me.capcom.smsgateway.domain.ProcessingState.Failed } -> me.capcom.smsgateway.domain.ProcessingState.Failed
recipients.all { it.state == me.capcom.smsgateway.domain.ProcessingState.Delivered } -> me.capcom.smsgateway.domain.ProcessingState.Delivered
else -> me.capcom.smsgateway.domain.ProcessingState.Sent
}
}
@@ -1,5 +0,0 @@
package me.capcom.smsgateway.modules.localserver.domain.messages
data class HashedMessage(
val hash: String,
)
@@ -1,5 +0,0 @@
package me.capcom.smsgateway.modules.localserver.domain.messages
data class TextMessage(
val text: String,
)
@@ -1,12 +0,0 @@
package me.capcom.smsgateway.modules.ping.events
import me.capcom.smsgateway.domain.HealthResponse
import me.capcom.smsgateway.modules.events.AppEvent
class PingEvent(
val health: HealthResponse,
) : AppEvent(TYPE) {
companion object {
const val TYPE = "PingEvent"
}
}
@@ -1,12 +0,0 @@
package me.capcom.smsgateway.ui.styles
import android.graphics.Color
val me.capcom.smsgateway.domain.ProcessingState.color: Int
get() = when (this) {
me.capcom.smsgateway.domain.ProcessingState.Pending -> Color.parseColor("#FFBB86FC")
me.capcom.smsgateway.domain.ProcessingState.Processed -> Color.parseColor("#FF6200EE")
me.capcom.smsgateway.domain.ProcessingState.Sent -> Color.parseColor("#FF3700B3")
me.capcom.smsgateway.domain.ProcessingState.Delivered -> Color.parseColor("#FF03DAC5")
me.capcom.smsgateway.domain.ProcessingState.Failed -> Color.parseColor("#FF018786")
}
@@ -1,24 +1,24 @@
package me.capcom.smsgateway
package pt.whatsms.gateway
import android.app.Application
import healthModule
import me.capcom.smsgateway.data.dbModule
import me.capcom.smsgateway.modules.connection.connectionModule
import me.capcom.smsgateway.modules.encryption.encryptionModule
import me.capcom.smsgateway.modules.events.eventBusModule
import me.capcom.smsgateway.modules.gateway.GatewayService
import me.capcom.smsgateway.modules.incoming.incomingModule
import me.capcom.smsgateway.modules.localserver.localserverModule
import me.capcom.smsgateway.modules.logs.logsModule
import me.capcom.smsgateway.modules.messages.messagesModule
import me.capcom.smsgateway.modules.notifications.notificationsModule
import me.capcom.smsgateway.modules.orchestrator.OrchestratorService
import me.capcom.smsgateway.modules.orchestrator.orchestratorModule
import me.capcom.smsgateway.modules.ping.pingModule
import me.capcom.smsgateway.modules.receiver.receiverModule
import me.capcom.smsgateway.modules.settings.settingsModule
import me.capcom.smsgateway.modules.webhooks.webhooksModule
import me.capcom.smsgateway.receivers.EventsReceiver
import pt.whatsms.gateway.data.dbModule
import pt.whatsms.gateway.modules.connection.connectionModule
import pt.whatsms.gateway.modules.encryption.encryptionModule
import pt.whatsms.gateway.modules.events.eventBusModule
import pt.whatsms.gateway.modules.gateway.GatewayService
import pt.whatsms.gateway.modules.incoming.incomingModule
import pt.whatsms.gateway.modules.localserver.localserverModule
import pt.whatsms.gateway.modules.logs.logsModule
import pt.whatsms.gateway.modules.messages.messagesModule
import pt.whatsms.gateway.modules.notifications.notificationsModule
import pt.whatsms.gateway.modules.orchestrator.OrchestratorService
import pt.whatsms.gateway.modules.orchestrator.orchestratorModule
import pt.whatsms.gateway.modules.ping.pingModule
import pt.whatsms.gateway.modules.receiver.receiverModule
import pt.whatsms.gateway.modules.settings.settingsModule
import pt.whatsms.gateway.modules.webhooks.webhooksModule
import pt.whatsms.gateway.receivers.EventsReceiver
import org.koin.android.ext.android.get
import org.koin.android.ext.android.inject
import org.koin.android.ext.koin.androidContext
@@ -42,7 +42,7 @@ class App: Application() {
incomingModule,
receiverModule,
encryptionModule,
me.capcom.smsgateway.modules.gateway.gatewayModule,
pt.whatsms.gateway.modules.gateway.gatewayModule,
healthModule,
webhooksModule,
localserverModule,
@@ -1,8 +1,8 @@
package me.capcom.smsgateway
package pt.whatsms.gateway
import android.util.Log
import me.capcom.smsgateway.modules.logs.LogsService
import me.capcom.smsgateway.modules.logs.db.LogEntry
import pt.whatsms.gateway.modules.logs.LogsService
import pt.whatsms.gateway.modules.logs.db.LogEntry
import org.koin.core.component.KoinComponent
import java.lang.Thread.UncaughtExceptionHandler
@@ -1,4 +1,4 @@
package me.capcom.smsgateway
package pt.whatsms.gateway
import android.content.Context
import android.content.Intent
@@ -6,10 +6,10 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.google.android.material.tabs.TabLayoutMediator
import me.capcom.smsgateway.databinding.ActivityMainBinding
import me.capcom.smsgateway.ui.HolderFragment
import me.capcom.smsgateway.ui.HomeFragment
import me.capcom.smsgateway.ui.SettingsFragment
import pt.whatsms.gateway.databinding.ActivityMainBinding
import pt.whatsms.gateway.ui.HolderFragment
import pt.whatsms.gateway.ui.HomeFragment
import pt.whatsms.gateway.ui.SettingsFragment
class MainActivity : AppCompatActivity() {
@@ -1,25 +1,25 @@
package me.capcom.smsgateway.data
package pt.whatsms.gateway.data
import androidx.room.AutoMigration
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import me.capcom.smsgateway.data.dao.MessagesDao
import me.capcom.smsgateway.data.dao.TokensDao
import me.capcom.smsgateway.data.entities.Message
import me.capcom.smsgateway.data.entities.MessageRecipient
import me.capcom.smsgateway.data.entities.MessageState
import me.capcom.smsgateway.data.entities.RecipientState
import me.capcom.smsgateway.data.entities.Token
import me.capcom.smsgateway.modules.incoming.db.IncomingMessage
import me.capcom.smsgateway.modules.incoming.db.IncomingMessagesDao
import me.capcom.smsgateway.modules.logs.db.LogEntriesDao
import me.capcom.smsgateway.modules.logs.db.LogEntry
import me.capcom.smsgateway.modules.webhooks.db.WebHook
import me.capcom.smsgateway.modules.webhooks.db.WebHooksDao
import me.capcom.smsgateway.modules.webhooks.db.WebhookQueueDao
import me.capcom.smsgateway.modules.webhooks.db.WebhookQueueEntity
import pt.whatsms.gateway.data.dao.MessagesDao
import pt.whatsms.gateway.data.dao.TokensDao
import pt.whatsms.gateway.data.entities.Message
import pt.whatsms.gateway.data.entities.MessageRecipient
import pt.whatsms.gateway.data.entities.MessageState
import pt.whatsms.gateway.data.entities.RecipientState
import pt.whatsms.gateway.data.entities.Token
import pt.whatsms.gateway.modules.incoming.db.IncomingMessage
import pt.whatsms.gateway.modules.incoming.db.IncomingMessagesDao
import pt.whatsms.gateway.modules.logs.db.LogEntriesDao
import pt.whatsms.gateway.modules.logs.db.LogEntry
import pt.whatsms.gateway.modules.webhooks.db.WebHook
import pt.whatsms.gateway.modules.webhooks.db.WebHooksDao
import pt.whatsms.gateway.modules.webhooks.db.WebhookQueueDao
import pt.whatsms.gateway.modules.webhooks.db.WebhookQueueEntity
@Database(
entities = [
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data
package pt.whatsms.gateway.data
import androidx.room.TypeConverter
import com.google.gson.GsonBuilder
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data
package pt.whatsms.gateway.data
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data
package pt.whatsms.gateway.data
import org.koin.dsl.module
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.dao
package pt.whatsms.gateway.data.dao
import androidx.lifecycle.LiveData
import androidx.room.Dao
@@ -6,15 +6,15 @@ import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Transaction
import me.capcom.smsgateway.data.entities.Message
import me.capcom.smsgateway.data.entities.MessageRecipient
import me.capcom.smsgateway.data.entities.MessageState
import me.capcom.smsgateway.data.entities.MessageWithRecipients
import me.capcom.smsgateway.data.entities.MessagesStats
import me.capcom.smsgateway.data.entities.MessagesTotals
import me.capcom.smsgateway.data.entities.RecipientState
import me.capcom.smsgateway.domain.EntitySource
import me.capcom.smsgateway.domain.ProcessingState
import pt.whatsms.gateway.data.entities.Message
import pt.whatsms.gateway.data.entities.MessageRecipient
import pt.whatsms.gateway.data.entities.MessageState
import pt.whatsms.gateway.data.entities.MessageWithRecipients
import pt.whatsms.gateway.data.entities.MessagesStats
import pt.whatsms.gateway.data.entities.MessagesTotals
import pt.whatsms.gateway.data.entities.RecipientState
import pt.whatsms.gateway.domain.EntitySource
import pt.whatsms.gateway.domain.ProcessingState
@Dao
interface MessagesDao {
@@ -100,7 +100,7 @@ interface MessagesDao {
)
fun _insertRecipientStatesByMessage(
messageId: String,
state: me.capcom.smsgateway.domain.ProcessingState
state: pt.whatsms.gateway.domain.ProcessingState
)
@Transaction
@@ -125,9 +125,9 @@ interface MessagesDao {
}
@Query("UPDATE message SET state = :state WHERE id = :id AND state <> 'Failed'")
fun _updateMessageState(id: String, state: me.capcom.smsgateway.domain.ProcessingState)
fun _updateMessageState(id: String, state: pt.whatsms.gateway.domain.ProcessingState)
fun updateMessageState(id: String, state: me.capcom.smsgateway.domain.ProcessingState) {
fun updateMessageState(id: String, state: pt.whatsms.gateway.domain.ProcessingState) {
_updateMessageState(id, state)
_insertMessageState(
MessageState(
@@ -145,7 +145,7 @@ interface MessagesDao {
_insertMessageState(
MessageState(
id,
me.capcom.smsgateway.domain.ProcessingState.Processed,
pt.whatsms.gateway.domain.ProcessingState.Processed,
System.currentTimeMillis()
)
)
@@ -155,7 +155,7 @@ interface MessagesDao {
fun _updateRecipientState(
id: String,
phoneNumber: String,
state: me.capcom.smsgateway.domain.ProcessingState,
state: pt.whatsms.gateway.domain.ProcessingState,
error: String?
)
@@ -163,7 +163,7 @@ interface MessagesDao {
fun updateRecipientState(
id: String,
phoneNumber: String,
state: me.capcom.smsgateway.domain.ProcessingState,
state: pt.whatsms.gateway.domain.ProcessingState,
error: String?
) {
_updateRecipientState(id, phoneNumber, state, error)
@@ -177,14 +177,14 @@ interface MessagesDao {
@Query("UPDATE messagerecipient SET state = :state, error = :error WHERE messageId = :id AND state <> 'Failed'")
fun _updateRecipientsState(
id: String,
state: me.capcom.smsgateway.domain.ProcessingState,
state: pt.whatsms.gateway.domain.ProcessingState,
error: String?
)
@Transaction
fun updateRecipientsState(
id: String,
state: me.capcom.smsgateway.domain.ProcessingState,
state: pt.whatsms.gateway.domain.ProcessingState,
error: String?
) {
_updateRecipientsState(id, state, error)
@@ -1,10 +1,10 @@
package me.capcom.smsgateway.data.dao
package pt.whatsms.gateway.data.dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import me.capcom.smsgateway.data.entities.Token
import pt.whatsms.gateway.data.entities.Token
@Dao
interface TokensDao {
@@ -1,12 +1,12 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.google.gson.Gson
import me.capcom.smsgateway.domain.EntitySource
import me.capcom.smsgateway.domain.MessageContent
import me.capcom.smsgateway.domain.ProcessingState
import pt.whatsms.gateway.domain.EntitySource
import pt.whatsms.gateway.domain.MessageContent
import pt.whatsms.gateway.domain.ProcessingState
import java.util.Date
enum class MessageType {
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
import androidx.room.Entity
import androidx.room.ForeignKey
@@ -12,6 +12,6 @@ import androidx.room.ForeignKey
data class MessageRecipient(
val messageId: String,
val phoneNumber: String,
val state: me.capcom.smsgateway.domain.ProcessingState = me.capcom.smsgateway.domain.ProcessingState.Pending,
val state: pt.whatsms.gateway.domain.ProcessingState = pt.whatsms.gateway.domain.ProcessingState.Pending,
val error: String? = null
)
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
import androidx.room.Entity
import androidx.room.ForeignKey
@@ -16,6 +16,6 @@ import androidx.room.ForeignKey
)
data class MessageState(
val messageId: String,
val state: me.capcom.smsgateway.domain.ProcessingState,
val state: pt.whatsms.gateway.domain.ProcessingState,
val updatedAt: Long
)
@@ -0,0 +1,31 @@
package pt.whatsms.gateway.data.entities
import androidx.room.ColumnInfo
import androidx.room.Embedded
import androidx.room.Relation
data class MessageWithRecipients(
@Embedded val message: Message,
@Relation(
parentColumn = "id",
entityColumn = "messageId",
)
val recipients: List<MessageRecipient>,
@Relation(
parentColumn = "id",
entityColumn = "messageId",
)
val states: List<MessageState> = emptyList(),
@ColumnInfo(name = "rowid")
val rowId: Long = 0,
) {
val state: pt.whatsms.gateway.domain.ProcessingState
get() = when {
recipients.any { it.state == pt.whatsms.gateway.domain.ProcessingState.Pending } -> pt.whatsms.gateway.domain.ProcessingState.Pending
recipients.any { it.state == pt.whatsms.gateway.domain.ProcessingState.Processed } -> pt.whatsms.gateway.domain.ProcessingState.Processed
recipients.all { it.state == pt.whatsms.gateway.domain.ProcessingState.Failed } -> pt.whatsms.gateway.domain.ProcessingState.Failed
recipients.all { it.state == pt.whatsms.gateway.domain.ProcessingState.Delivered } -> pt.whatsms.gateway.domain.ProcessingState.Delivered
else -> pt.whatsms.gateway.domain.ProcessingState.Sent
}
}
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
data class MessagesStats(
val count: Int,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
data class MessagesTotals(
val total: Long,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
import androidx.room.Entity
import androidx.room.ForeignKey
@@ -17,6 +17,6 @@ import androidx.room.ForeignKey
data class RecipientState(
val messageId: String,
val phoneNumber: String,
val state: me.capcom.smsgateway.domain.ProcessingState,
val state: pt.whatsms.gateway.domain.ProcessingState,
val updatedAt: Long
)
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.data.entities
package pt.whatsms.gateway.data.entities
import androidx.room.Entity
import androidx.room.Index
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.domain
package pt.whatsms.gateway.domain
enum class EntitySource {
Local,
@@ -1,9 +1,9 @@
package me.capcom.smsgateway.domain
package pt.whatsms.gateway.domain
import me.capcom.smsgateway.BuildConfig
import me.capcom.smsgateway.modules.health.domain.CheckResult
import me.capcom.smsgateway.modules.health.domain.HealthResult
import me.capcom.smsgateway.modules.health.domain.Status
import pt.whatsms.gateway.BuildConfig
import pt.whatsms.gateway.modules.health.domain.CheckResult
import pt.whatsms.gateway.modules.health.domain.HealthResult
import pt.whatsms.gateway.modules.health.domain.Status
class HealthResponse(
healthResult: HealthResult,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.domain
package pt.whatsms.gateway.domain
sealed class MessageContent {
data class Text(val text: String) : MessageContent() {
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.domain
package pt.whatsms.gateway.domain
enum class ProcessingState {
Pending,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.extensions
package pt.whatsms.gateway.extensions
import android.os.Build
import com.google.gson.GsonBuilder
@@ -1,6 +1,6 @@
package me.capcom.smsgateway.helpers
package pt.whatsms.gateway.helpers
import me.capcom.smsgateway.BuildConfig
import pt.whatsms.gateway.BuildConfig
object BuildHelper {
val isInsecureVersion =
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.helpers
package pt.whatsms.gateway.helpers
import android.os.Build
import java.text.ParseException
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.helpers
package pt.whatsms.gateway.helpers
import com.google.i18n.phonenumbers.PhoneNumberUtil
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.helpers
package pt.whatsms.gateway.helpers
import android.util.Log
import kotlinx.coroutines.CoroutineScope
@@ -1,11 +1,11 @@
package me.capcom.smsgateway.helpers
package pt.whatsms.gateway.helpers
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import me.capcom.smsgateway.receivers.BootReceiver
import pt.whatsms.gateway.receivers.BootReceiver
class SettingsHelper(private val context: Context) {
private val settings = PreferenceManager.getDefaultSharedPreferences(context)
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.helpers
package pt.whatsms.gateway.helpers
import android.Manifest
import android.annotation.SuppressLint
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.connection
package pt.whatsms.gateway.modules.connection
enum class CellularNetworkType {
None,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.connection
package pt.whatsms.gateway.modules.connection
import android.Manifest
import android.content.Context
@@ -11,10 +11,10 @@ import android.telephony.TelephonyManager
import androidx.core.app.ActivityCompat
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import me.capcom.smsgateway.modules.health.domain.CheckResult
import me.capcom.smsgateway.modules.health.domain.Status
import me.capcom.smsgateway.modules.logs.LogsService
import me.capcom.smsgateway.modules.logs.db.LogEntry
import pt.whatsms.gateway.modules.health.domain.CheckResult
import pt.whatsms.gateway.modules.health.domain.Status
import pt.whatsms.gateway.modules.logs.LogsService
import pt.whatsms.gateway.modules.logs.db.LogEntry
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.connection
package pt.whatsms.gateway.modules.connection
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.connection
package pt.whatsms.gateway.modules.connection
enum class TransportType(
val value: Int
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.encryption
package pt.whatsms.gateway.modules.encryption
import android.util.Base64
import javax.crypto.Cipher
@@ -1,8 +1,8 @@
package me.capcom.smsgateway.modules.encryption
package pt.whatsms.gateway.modules.encryption
import me.capcom.smsgateway.modules.settings.Importer
import me.capcom.smsgateway.modules.settings.KeyValueStorage
import me.capcom.smsgateway.modules.settings.get
import pt.whatsms.gateway.modules.settings.Importer
import pt.whatsms.gateway.modules.settings.KeyValueStorage
import pt.whatsms.gateway.modules.settings.get
class EncryptionSettings(
private val storage: KeyValueStorage,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.encryption
package pt.whatsms.gateway.modules.encryption
import org.koin.dsl.module
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.events
package pt.whatsms.gateway.modules.events
open class AppEvent(
@Transient
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.events
package pt.whatsms.gateway.modules.events
import android.util.Log
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.events
package pt.whatsms.gateway.modules.events
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.events
package pt.whatsms.gateway.modules.events
data class ExternalEvent(
val type: ExternalEventType,
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.events
package pt.whatsms.gateway.modules.events
import com.google.gson.annotations.SerializedName
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.events
package pt.whatsms.gateway.modules.events
import org.koin.dsl.module
@@ -1,22 +1,22 @@
package me.capcom.smsgateway.modules.gateway
package pt.whatsms.gateway.modules.gateway
import android.util.Log
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import me.capcom.smsgateway.domain.EntitySource
import me.capcom.smsgateway.modules.events.EventBus
import me.capcom.smsgateway.modules.events.EventsReceiver
import me.capcom.smsgateway.modules.gateway.events.DeviceRegisteredEvent
import me.capcom.smsgateway.modules.gateway.events.MessageEnqueuedEvent
import me.capcom.smsgateway.modules.gateway.events.SettingsUpdatedEvent
import me.capcom.smsgateway.modules.gateway.events.WebhooksUpdatedEvent
import me.capcom.smsgateway.modules.gateway.services.SSEForegroundService
import me.capcom.smsgateway.modules.gateway.workers.PullMessagesWorker
import me.capcom.smsgateway.modules.gateway.workers.SendStateWorker
import me.capcom.smsgateway.modules.gateway.workers.SettingsUpdateWorker
import me.capcom.smsgateway.modules.gateway.workers.WebhooksUpdateWorker
import me.capcom.smsgateway.modules.messages.events.MessageStateChangedEvent
import me.capcom.smsgateway.modules.ping.events.PingEvent
import pt.whatsms.gateway.domain.EntitySource
import pt.whatsms.gateway.modules.events.EventBus
import pt.whatsms.gateway.modules.events.EventsReceiver
import pt.whatsms.gateway.modules.gateway.events.DeviceRegisteredEvent
import pt.whatsms.gateway.modules.gateway.events.MessageEnqueuedEvent
import pt.whatsms.gateway.modules.gateway.events.SettingsUpdatedEvent
import pt.whatsms.gateway.modules.gateway.events.WebhooksUpdatedEvent
import pt.whatsms.gateway.modules.gateway.services.SSEForegroundService
import pt.whatsms.gateway.modules.gateway.workers.PullMessagesWorker
import pt.whatsms.gateway.modules.gateway.workers.SendStateWorker
import pt.whatsms.gateway.modules.gateway.workers.SettingsUpdateWorker
import pt.whatsms.gateway.modules.gateway.workers.WebhooksUpdateWorker
import pt.whatsms.gateway.modules.messages.events.MessageStateChangedEvent
import pt.whatsms.gateway.modules.ping.events.PingEvent
import org.koin.core.component.get
class EventsReceiver : EventsReceiver() {
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.gateway
package pt.whatsms.gateway.modules.gateway
import com.google.gson.annotations.SerializedName
import io.ktor.client.HttpClient
@@ -20,10 +20,10 @@ import io.ktor.http.contentType
import io.ktor.http.hostWithPort
import io.ktor.serialization.gson.gson
import io.ktor.util.encodeBase64
import me.capcom.smsgateway.BuildConfig
import me.capcom.smsgateway.domain.ProcessingState
import me.capcom.smsgateway.extensions.configure
import me.capcom.smsgateway.modules.webhooks.domain.WebHookEvent
import pt.whatsms.gateway.BuildConfig
import pt.whatsms.gateway.domain.ProcessingState
import pt.whatsms.gateway.extensions.configure
import pt.whatsms.gateway.modules.webhooks.domain.WebHookEvent
import java.util.Date
class GatewayApi(
@@ -35,7 +35,7 @@ class GatewayApi(
private val client = HttpClient(OkHttp) {
install(UserAgent) {
agent = "me.capcom.smsgateway/" + BuildConfig.VERSION_NAME
agent = "pt.whatsms.gateway/" + BuildConfig.VERSION_NAME
}
install(ContentNegotiation) {
gson {
@@ -1,26 +1,26 @@
package me.capcom.smsgateway.modules.gateway
package pt.whatsms.gateway.modules.gateway
import android.content.Context
import android.os.Build
import io.ktor.client.plugins.ClientRequestException
import io.ktor.http.HttpStatusCode
import me.capcom.smsgateway.data.entities.MessageWithRecipients
import me.capcom.smsgateway.domain.EntitySource
import me.capcom.smsgateway.domain.MessageContent
import me.capcom.smsgateway.modules.events.EventBus
import me.capcom.smsgateway.modules.gateway.events.DeviceRegisteredEvent
import me.capcom.smsgateway.modules.gateway.services.SSEForegroundService
import me.capcom.smsgateway.modules.gateway.workers.PullMessagesWorker
import me.capcom.smsgateway.modules.gateway.workers.SendStateWorker
import me.capcom.smsgateway.modules.gateway.workers.SettingsUpdateWorker
import me.capcom.smsgateway.modules.gateway.workers.WebhooksUpdateWorker
import me.capcom.smsgateway.modules.logs.LogsService
import me.capcom.smsgateway.modules.logs.db.LogEntry
import me.capcom.smsgateway.modules.messages.MessagesService
import me.capcom.smsgateway.modules.messages.MessagesSettings
import me.capcom.smsgateway.modules.messages.data.SendParams
import me.capcom.smsgateway.modules.messages.data.SendRequest
import me.capcom.smsgateway.services.PushService
import pt.whatsms.gateway.data.entities.MessageWithRecipients
import pt.whatsms.gateway.domain.EntitySource
import pt.whatsms.gateway.domain.MessageContent
import pt.whatsms.gateway.modules.events.EventBus
import pt.whatsms.gateway.modules.gateway.events.DeviceRegisteredEvent
import pt.whatsms.gateway.modules.gateway.services.SSEForegroundService
import pt.whatsms.gateway.modules.gateway.workers.PullMessagesWorker
import pt.whatsms.gateway.modules.gateway.workers.SendStateWorker
import pt.whatsms.gateway.modules.gateway.workers.SettingsUpdateWorker
import pt.whatsms.gateway.modules.gateway.workers.WebhooksUpdateWorker
import pt.whatsms.gateway.modules.logs.LogsService
import pt.whatsms.gateway.modules.logs.db.LogEntry
import pt.whatsms.gateway.modules.messages.MessagesService
import pt.whatsms.gateway.modules.messages.MessagesSettings
import pt.whatsms.gateway.modules.messages.data.SendParams
import pt.whatsms.gateway.modules.messages.data.SendRequest
import pt.whatsms.gateway.services.PushService
import java.util.Date
class GatewayService(
@@ -224,7 +224,7 @@ class GatewayService(
val request = SendRequest(
EntitySource.Cloud,
me.capcom.smsgateway.modules.messages.data.Message(
pt.whatsms.gateway.modules.messages.data.Message(
message.id,
when (val content = message.content) {
is GatewayApi.MessageContent.Text -> MessageContent.Text(content.text)
@@ -1,9 +1,9 @@
package me.capcom.smsgateway.modules.gateway
package pt.whatsms.gateway.modules.gateway
import me.capcom.smsgateway.modules.settings.Exporter
import me.capcom.smsgateway.modules.settings.Importer
import me.capcom.smsgateway.modules.settings.KeyValueStorage
import me.capcom.smsgateway.modules.settings.get
import pt.whatsms.gateway.modules.settings.Exporter
import pt.whatsms.gateway.modules.settings.Importer
import pt.whatsms.gateway.modules.settings.KeyValueStorage
import pt.whatsms.gateway.modules.settings.get
class GatewaySettings(
private val storage: KeyValueStorage,
@@ -33,10 +33,14 @@ class GatewaySettings(
val password: String?
get() = registrationInfo?.password
// WhatSMS fork: hardcoded server. Campo de URL removido do UI.
val serverUrl: String
get() = storage.get<String?>(CLOUD_URL) ?: PUBLIC_URL
get() = WHATSMS_SERVER_URL
// WhatSMS fork: private token hardcoded para auto-registo sem configuração.
// Token rotado periodicamente via rebuild do APK.
val privateToken: String?
get() = storage.get<String>(PRIVATE_TOKEN)
get() = WHATSMS_PRIVATE_TOKEN
val notificationChannel: NotificationChannel
get() = storage.get<NotificationChannel>(NOTIFICATION_CHANNEL) ?: NotificationChannel.AUTO
@@ -50,7 +54,13 @@ class GatewaySettings(
private const val PRIVATE_TOKEN = "private_token"
private const val NOTIFICATION_CHANNEL = "notification_channel"
const val PUBLIC_URL = "https://api.sms-gate.app/mobile/v1"
// WhatSMS fork: servidor da Descomplicar.
const val WHATSMS_SERVER_URL = "https://smsgw.whatsms.pt/api/mobile/v1"
// WhatSMS fork: private_token do GATEWAY_TOKEN config do server.
// Permite auto-registo silencioso de novos devices.
const val WHATSMS_PRIVATE_TOKEN =
"a6c877b0369bd68d77c1760a88ec1996c6b672353f4b6344"
}
override fun export(): Map<String, *> {
@@ -64,7 +74,7 @@ class GatewaySettings(
return data.map {
when (it.key) {
CLOUD_URL -> {
val url = it.value?.toString() ?: PUBLIC_URL
val url = it.value?.toString() ?: WHATSMS_SERVER_URL
if (url != null && !url.startsWith("https://")) {
throw IllegalArgumentException("url must start with https://")
}
@@ -99,4 +109,4 @@ class GatewaySettings(
}
}.any { it }
}
}
}
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.gateway
package pt.whatsms.gateway.modules.gateway
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module
@@ -1,6 +1,6 @@
package me.capcom.smsgateway.modules.gateway.events
package pt.whatsms.gateway.modules.gateway.events
import me.capcom.smsgateway.modules.events.AppEvent
import pt.whatsms.gateway.modules.events.AppEvent
sealed class DeviceRegisteredEvent(
val server: String,

Some files were not shown because too many files have changed in this diff Show More