Release 'v0.0.4'
This commit is contained in:
parent
a35794171c
commit
77f992b08e
137 changed files with 1092 additions and 886 deletions
|
@ -1,7 +1,7 @@
|
|||
BASE_URL="https://zv.example.org"
|
||||
AUTH_SECRET="Ah6Lm3h8Qmnhm8oDfw09AOUYEOMKpzfqIFPjBA2waLPm9SD65BA1eSXde9OS80nE"
|
||||
DATABASE_URL="Server=aptabase_db;Port=5432;User Id=aptabase;Password=0000000000000000000000000000000000000000000000000000000000000000;Database=aptabase"
|
||||
CLICKHOUSE_URL="Host=aptabase_events_db;Port=8123;Username=aptabase;Password=0000000000000000000000000000000000000000000000000000000000000000"
|
||||
DATABASE_URL="Server=zalvena_database;Port=5432;User Id=zalvena;Password=0000000000000000000000000000000000000000000000000000000000000000;Database=zalvena"
|
||||
CLICKHOUSE_URL="Host=zalvena_events;Port=8123;Username=zalvena;Password=0000000000000000000000000000000000000000000000000000000000000000"
|
||||
SMTP_HOST="smtp.resend.com"
|
||||
SMTP_PORT="465"
|
||||
SMTP_USERNAME="resend"
|
||||
|
|
73
CHANGES.md
Normal file
73
CHANGES.md
Normal file
|
@ -0,0 +1,73 @@
|
|||
# Changelog
|
||||
|
||||
## v0.0.4
|
||||
| New Login Page | New Registration Page |
|
||||
|-|-|
|
||||
| <img width="500px" src="https://ocean.sudovanilla.org/media/images/Screenshot-From-2025-02-20-22-35-24.png"> | <img width="500px" src="https://ocean.sudovanilla.org/media/images/Screenshot-From-2025-02-20-22-35-27.png"> |
|
||||
|
||||
| New Login Email | New Registration Email |
|
||||
|-|-|
|
||||
| <img width="250px" src="https://ocean.sudovanilla.org/media/images/Screenshot-From-2025-02-21-01-59-16.png"> | <img width="250px" src="https://ocean.sudovanilla.org/media/images/Screenshot-From-2025-02-21-01-59-42.png"> |
|
||||
|
||||
- Added new email templates
|
||||
- Added new logo
|
||||
- Added new designs of the login and registration screens
|
||||
- Updated `Aptabase` backend functions to be renamed to `Zalvena`
|
||||
- Updated `<DataResidency/>` component and add `Mars` server
|
||||
- Updated cloud origin policy to use official Zalvena domains
|
||||
- `https://events.sudovanilla.org/`
|
||||
- `https://beta.events.sudovanilla.org/`
|
||||
- Removed official Aptabase servers in `regions`, replaced with official Zalvena server
|
||||
- Removed billing
|
||||
|
||||
## v0.0.1 - v0.0.3
|
||||
- Updated app key generation to use `ZV` instead of `SH`
|
||||
- Updated the name "Aptabase" to "Zalvena" in some sections
|
||||
- Updated browserslist
|
||||
- Updated `node:18` to `over/bun:1` in `Dockerfile`
|
||||
- Updated the pacakge `@types/node` from `20.8.7` to `22.13.4`
|
||||
- Updated the pacakge `@types/react` from `18.2.30` to `19.0.10`
|
||||
- Updated the pacakge `@types/react-dom` from `18.2.14` to `19.0.4`
|
||||
- Updated the pacakge `@vitejs/plugin-react-swc` from `3.4.0` to `3.8.0`
|
||||
- Updated the pacakge `autoprefixer` from `10.4.16` to `10.4.20`
|
||||
- Updated the pacakge `postcss` from `8.4.31` to `8.5.3`
|
||||
- Updated the pacakge `tailwind-merge` from `1.14.0` to `3.0.1`
|
||||
- Updated the pacakge `typescript` from `5.2.2` to `5.7.3`
|
||||
- Updated the pacakge `vite` from `4.5.3` to `6.1.1`
|
||||
- Updated the pacakge `vite-plugin-mkcert` from `1.17.5` to `1.17.6`
|
||||
- Updated the pacakge `@aptabase/web` from `0.4.0` to `0.4.3`
|
||||
- Updated the pacakge `@fontsource/inter` from `5.0.14` to `5.1.1`
|
||||
- Updated the pacakge `@headlessui/react` from `2.1.2` to `2.2.0`
|
||||
- Updated the pacakge `@radix-ui/react-accordion` from `1.1.2` to `1.2.3`
|
||||
- Updated the pacakge `@radix-ui/react-label` from `2.0.2` to `2.1.2`
|
||||
- Updated the pacakge `@radix-ui/react-popover` from `1.0.7` to `1.1.6`
|
||||
- Updated the pacakge `@radix-ui/react-select` from `2.0.0` to `2.1.6`
|
||||
- Updated the pacakge `@radix-ui/react-slot` from `1.0.2` to `1.1.2`
|
||||
- Updated the pacakge `@radix-ui/react-tabs` from `1.0.4` to `1.1.3`
|
||||
- Updated the pacakge `@radix-ui/react-tooltip` from `1.0.7` to `1.1.8`
|
||||
- Updated the pacakge `@tabler/icons-react` from `2.39.0` to `3.30.0`
|
||||
- Updated the pacakge `@tanstack/react-query` from `5.0.0` to `5.66.7`
|
||||
- Updated the pacakge `chart.js` from `4.4.0` to `4.4.8`
|
||||
- Updated the pacakge `chartjs-plugin-annotation` from `3.0.1` to `3.1.0`
|
||||
- Updated the pacakge `cmdk` from `0.2.1` to `1.0.4`
|
||||
- Updated the pacakge `date-fns` from `3.6.0` to `4.1.0`
|
||||
- Updated the pacakge `framer-motion` from `10.16.4` to `12.4.5`
|
||||
- Updated the pacakge `jotai` from `2.9.1` to `2.12.1`
|
||||
- Updated the pacakge `react` from `18.2.0` to `19.0.0`
|
||||
- Updated the pacakge `react-dom` from `18.2.0` to `19.0.0`
|
||||
- Updated the pacakge `react-markdown` from `9.0.0` to `9.0.3`
|
||||
- Updated the pacakge `react-router-dom` from `6.17.0` to `7.2.0`
|
||||
- Updated the pacakge `rehype-highlight` from `7.0.0` to `7.0.2`
|
||||
- Updated the pacakge `remark-gfm` from `4.0.0` to `4.0.1`
|
||||
- Updated the pacakge `sonner` from `1.0.3` to `2.0.0`
|
||||
- Added `.env.sample`
|
||||
- Redesigned login screen
|
||||
- Remote sources removed to make this fork comply with SudoVanilla Umbrella Policy
|
||||
- Default avatar points to https://md.sudovanilla.org/images/icons/Aptabase.jpg
|
||||
- Flags point to https://md.sudovanilla.org/images/flags/
|
||||
- Removed all support elements and Chirp
|
||||
- Removed instructions screen
|
||||
- Removed `/etc/tinybird`
|
||||
- Removed `/src/Properties/`
|
||||
- Removed `/tests/`
|
||||
- Removed `/tools/`
|
10
Dockerfile
10
Dockerfile
|
@ -2,16 +2,16 @@
|
|||
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS server
|
||||
WORKDIR /work/src
|
||||
|
||||
COPY ./src/Aptabase.csproj /work/src
|
||||
COPY ./src/Zalvena.csproj /work/src
|
||||
|
||||
ARG TARGETARCH
|
||||
RUN dotnet restore "./Aptabase.csproj" -a $TARGETARCH
|
||||
RUN dotnet restore "./Zalvena.csproj" -a $TARGETARCH
|
||||
|
||||
COPY ./etc/clickhouse /work/etc/clickhouse
|
||||
COPY ./etc/geoip /work/etc/geoip
|
||||
COPY ./src /work/src
|
||||
|
||||
RUN dotnet publish "Aptabase.csproj" -a $TARGETARCH -c Release -o /work/publish /p:UseAppHost=false
|
||||
RUN dotnet publish "Zalvena.csproj" -a $TARGETARCH -c Release -o /work/publish /p:UseAppHost=false
|
||||
|
||||
# WebApp Build
|
||||
FROM oven/bun:1 AS webapp
|
||||
|
@ -31,7 +31,7 @@ COPY --from=server /work/publish .
|
|||
COPY --from=webapp /work/wwwroot ./wwwroot
|
||||
COPY LICENSE .
|
||||
|
||||
ENTRYPOINT ["dotnet", "Aptabase.dll"]
|
||||
ENTRYPOINT ["dotnet", "Zalvena.dll"]
|
||||
|
||||
# Metadata
|
||||
LABEL org.opencontainers.image.title="Zalvena"
|
||||
|
@ -40,4 +40,4 @@ LABEL org.opencontainers.image.description="Fork of Aptabase"
|
|||
LABEL org.opencontainers.image.licenses="AGPLv3"
|
||||
LABEL org.opencontainers.image.url="https://ark.sudovanilla.org/Korbs/Zalvena/"
|
||||
LABEL org.opencontainers.image.source="https://ark.sudovanilla.org/Korbs/Zalvena/"
|
||||
LABEL org.opencontainers.image.version="0.0.3"
|
||||
LABEL org.opencontainers.image.version="0.0.4"
|
76
README.md
76
README.md
|
@ -2,69 +2,17 @@
|
|||
|
||||
A fork of Aptabase Server software, modified to only work with projects using Zalvena.
|
||||
|
||||
## Changes
|
||||
- Updated app key generation to use `ZV` instead of `SH`
|
||||
- Updated the name "Aptabase" to "Zalvena" in some sections
|
||||
- Updated browserslist
|
||||
- Updated `node:18` to `over/bun:1` in `Dockerfile`
|
||||
- Updated the pacakge `@types/node` from `20.8.7` to `22.13.4`
|
||||
- Updated the pacakge `@types/react` from `18.2.30` to `19.0.10`
|
||||
- Updated the pacakge `@types/react-dom` from `18.2.14` to `19.0.4`
|
||||
- Updated the pacakge `@vitejs/plugin-react-swc` from `3.4.0` to `3.8.0`
|
||||
- Updated the pacakge `autoprefixer` from `10.4.16` to `10.4.20`
|
||||
- Updated the pacakge `postcss` from `8.4.31` to `8.5.3`
|
||||
- Updated the pacakge `tailwind-merge` from `1.14.0` to `3.0.1`
|
||||
- Updated the pacakge `typescript` from `5.2.2` to `5.7.3`
|
||||
- Updated the pacakge `vite` from `4.5.3` to `6.1.1`
|
||||
- Updated the pacakge `vite-plugin-mkcert` from `1.17.5` to `1.17.6`
|
||||
- Updated the pacakge `@aptabase/web` from `0.4.0` to `0.4.3`
|
||||
- Updated the pacakge `@fontsource/inter` from `5.0.14` to `5.1.1`
|
||||
- Updated the pacakge `@headlessui/react` from `2.1.2` to `2.2.0`
|
||||
- Updated the pacakge `@radix-ui/react-accordion` from `1.1.2` to `1.2.3`
|
||||
- Updated the pacakge `@radix-ui/react-label` from `2.0.2` to `2.1.2`
|
||||
- Updated the pacakge `@radix-ui/react-popover` from `1.0.7` to `1.1.6`
|
||||
- Updated the pacakge `@radix-ui/react-select` from `2.0.0` to `2.1.6`
|
||||
- Updated the pacakge `@radix-ui/react-slot` from `1.0.2` to `1.1.2`
|
||||
- Updated the pacakge `@radix-ui/react-tabs` from `1.0.4` to `1.1.3`
|
||||
- Updated the pacakge `@radix-ui/react-tooltip` from `1.0.7` to `1.1.8`
|
||||
- Updated the pacakge `@tabler/icons-react` from `2.39.0` to `3.30.0`
|
||||
- Updated the pacakge `@tanstack/react-query` from `5.0.0` to `5.66.7`
|
||||
- Updated the pacakge `chart.js` from `4.4.0` to `4.4.8`
|
||||
- Updated the pacakge `chartjs-plugin-annotation` from `3.0.1` to `3.1.0`
|
||||
- Updated the pacakge `cmdk` from `0.2.1` to `1.0.4`
|
||||
- Updated the pacakge `date-fns` from `3.6.0` to `4.1.0`
|
||||
- Updated the pacakge `framer-motion` from `10.16.4` to `12.4.5`
|
||||
- Updated the pacakge `jotai` from `2.9.1` to `2.12.1`
|
||||
- Updated the pacakge `react` from `18.2.0` to `19.0.0`
|
||||
- Updated the pacakge `react-dom` from `18.2.0` to `19.0.0`
|
||||
- Updated the pacakge `react-markdown` from `9.0.0` to `9.0.3`
|
||||
- Updated the pacakge `react-router-dom` from `6.17.0` to `7.2.0`
|
||||
- Updated the pacakge `rehype-highlight` from `7.0.0` to `7.0.2`
|
||||
- Updated the pacakge `remark-gfm` from `4.0.0` to `4.0.1`
|
||||
- Updated the pacakge `sonner` from `1.0.3` to `2.0.0`
|
||||
- Added `.env.sample`
|
||||
- Redesigned login screen
|
||||
- Remote sources removed to make this fork comply with SudoVanilla Umbrella Policy
|
||||
- Default avatar points to https://md.sudovanilla.org/images/icons/Aptabase.jpg
|
||||
- Flags point to https://md.sudovanilla.org/images/flags/
|
||||
- Removed all support elements and Chirp
|
||||
- Removed instructions screen
|
||||
- Removed `/etc/tinybird`
|
||||
- Removed `/src/Properties/`
|
||||
- Removed `/tests/`
|
||||
- Removed `/tools/`
|
||||
|
||||
## Planned Changes
|
||||
- Revamp emails
|
||||
- Use SudoVanilla Gateway email template
|
||||
- Revamp design
|
||||
- Use Mona Font
|
||||
- Replace sidebar layout with header
|
||||
- Replace Tabler icons with Iconoir
|
||||
- Add SudoVanilla Gateway OpenID Login
|
||||
- Add new instruction screens
|
||||
- Remove all traces of Aptabase trademarks, branding, and name to differentiate Zalvena from Aptabase
|
||||
- Remove all Aptabase Cloud functions including Billing, US/EU Regions, and more
|
||||
- [x] Revamp emails
|
||||
- [ ] Revamp design
|
||||
- [ ] Use Mona Font
|
||||
- [ ] Replace sidebar layout with header
|
||||
- [ ] Replace Tabler icons with Iconoir
|
||||
- [x] New login screens
|
||||
- [ ] Add SudoVanilla Gateway OpenID Login
|
||||
- [ ] Add new instruction screens
|
||||
- [ ] Remove all traces of Aptabase trademarks, branding, and name to differentiate Zalvena from Aptabase
|
||||
- [ ] Remove all Aptabase Cloud functions including Billing, US/EU Regions, and more
|
||||
|
||||
**Maybe**
|
||||
- Replace usage of React with Astro? 🤔
|
||||
|
@ -115,8 +63,8 @@ services:
|
|||
# .env
|
||||
BASE_URL="https://zv.example.org"
|
||||
AUTH_SECRET="Ah6Lm3h8Qmnhm8oDfw09AOUYEOMKpzfqIFPjBA2waLPm9SD65BA1eSXde9OS80nE"
|
||||
DATABASE_URL="Server=aptabase_db;Port=5432;User Id=aptabase;Password=0000000000000000000000000000000000000000000000000000000000000000;Database=aptabase"
|
||||
CLICKHOUSE_URL="Host=aptabase_events_db;Port=8123;Username=aptabase;Password=0000000000000000000000000000000000000000000000000000000000000000"
|
||||
DATABASE_URL="Server=zalvena_database;Port=5432;User Id=zalvena;Password=0000000000000000000000000000000000000000000000000000000000000000;Database=zalvena"
|
||||
CLICKHOUSE_URL="Host=zalvena_events;Port=8123;Username=zalvena;Password=0000000000000000000000000000000000000000000000000000000000000000"
|
||||
SMTP_HOST="smtp.resend.com"
|
||||
SMTP_PORT="465"
|
||||
SMTP_USERNAME="resend"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
# SudoVanilla Registry accepts OCI images instead of Docker images,
|
||||
# so `buidah` build tool is used instead.
|
||||
buildah build -t oci.registry.sudovanilla.org/zalvena --no-cache
|
||||
buildah build -t oci.registry.sudovanilla.org/zalvena
|
|
@ -1,28 +1,28 @@
|
|||
services:
|
||||
aptabase_db:
|
||||
container_name: aptabase_db
|
||||
zalvena_database:
|
||||
container_name: zalvena_database
|
||||
image: postgres:15-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- ./tmp/db-data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_USER: aptabase
|
||||
POSTGRES_USER: zalvena
|
||||
POSTGRES_PASSWORD: sLPnqXzjupt6pR1dumYrGeVXpVDup49hYRRn2TEUfRmF6eXbBu4CJYl5ynBFxXx8
|
||||
aptabase_events_db:
|
||||
container_name: aptabase_events_db
|
||||
zalvena_events:
|
||||
container_name: zalvena_events
|
||||
image: clickhouse/clickhouse-server:23.8.4.69-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- ./tmp/events-db-data:/var/lib/clickhouse
|
||||
environment:
|
||||
CLICKHOUSE_USER: aptabase
|
||||
CLICKHOUSE_USER: zalvena
|
||||
CLICKHOUSE_PASSWORD: lBxMObwAWOU8L4ieQPq1ZcbQeUND4FwwgEfvmGstU5o8IZS3XekInmKtcAwqSxgm
|
||||
ulimits:
|
||||
nofile:
|
||||
soft: 262144
|
||||
hard: 262144
|
||||
aptabase:
|
||||
container_name: aptabase_app
|
||||
zalvena:
|
||||
container_name: zalvena
|
||||
image: oci.registry.sudovanilla.org/zalvena
|
||||
restart: always
|
||||
env_file:
|
||||
|
@ -30,7 +30,7 @@ services:
|
|||
volumes:
|
||||
- /etc/hosts:/etc/hosts
|
||||
depends_on:
|
||||
- aptabase_events_db
|
||||
- aptabase_db
|
||||
- zalvena_events
|
||||
- zalvena_database
|
||||
ports:
|
||||
- 6521:8080
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using Dapper;
|
||||
using ClickHouse.Client.ADO;
|
||||
using Aptabase.Features;
|
||||
using Zalvena.Features;
|
||||
|
||||
namespace Aptabase.Data;
|
||||
namespace Zalvena.Data;
|
||||
|
||||
public interface IClickHouseMigrationRunner
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Data.Common;
|
||||
|
||||
namespace Aptabase.Data;
|
||||
namespace Zalvena.Data;
|
||||
|
||||
public interface IDbContext
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0001)]
|
||||
public class InitialSetup : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0002)]
|
||||
public class UserProvider : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0003)]
|
||||
public class AddBlobs : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0004)]
|
||||
public class AddAppSalt : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0005)]
|
||||
public class AppShares : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0006)]
|
||||
public class AddSubscriptions : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0007)]
|
||||
public class AddOnboardingFlag : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0008)]
|
||||
public class AddLockReason : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0009)]
|
||||
public class AddFreeTrial : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0010)]
|
||||
public class AddCache : Migration
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[Migration(0011)]
|
||||
public class AddFeatureFlags : Migration
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using FluentMigrator;
|
||||
using FluentMigrator.Builders.Create.Table;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
internal static class MigrationExtensions
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using FluentMigrator.Runner.VersionTableInfo;
|
||||
|
||||
namespace Aptabase.Data.Migrations;
|
||||
namespace Zalvena.Data.Migrations;
|
||||
|
||||
[VersionTableMetaData]
|
||||
public class VersionTable : IVersionTableMetaData
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using NanoidDotNet;
|
||||
|
||||
namespace Aptabase.Data;
|
||||
namespace Zalvena.Data;
|
||||
|
||||
public class NanoId
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Aptabase.Data;
|
||||
using Zalvena.Data;
|
||||
using Dapper;
|
||||
|
||||
namespace Aptabase.Features.Apps;
|
||||
namespace Zalvena.Features.Apps;
|
||||
|
||||
public class Application
|
||||
{
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
using Dapper;
|
||||
using Aptabase.Data;
|
||||
using Aptabase.Features.Blob;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Features.Blob;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Zalvena.Features.Authentication;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Aptabase.Features.Apps;
|
||||
namespace Zalvena.Features.Apps;
|
||||
|
||||
public class ApplicationShare
|
||||
{
|
||||
|
|
|
@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc;
|
|||
using Microsoft.AspNetCore.RateLimiting;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
|
||||
namespace Aptabase.Features.Authentication;
|
||||
namespace Zalvena.Features.Authentication;
|
||||
|
||||
public class SignInBodyRequest
|
||||
{
|
||||
|
@ -76,7 +76,7 @@ public class AuthController : Controller
|
|||
|
||||
[HttpGet("/api/_auth/me")]
|
||||
[IsAuthenticated]
|
||||
[EnableCors("AllowAptabaseCom")]
|
||||
[EnableCors("AllowZalvenaOrg")]
|
||||
public async Task<IActionResult> Me(CancellationToken cancellationToken)
|
||||
{
|
||||
var identity = this.GetCurrentUserIdentity();
|
||||
|
@ -89,7 +89,7 @@ public class AuthController : Controller
|
|||
|
||||
[HttpPost("/api/_auth/account/delete")]
|
||||
[IsAuthenticated]
|
||||
[EnableCors("AllowAptabaseCom")]
|
||||
[EnableCors("AllowZalvenaOrg")]
|
||||
public async Task<IActionResult> DeleteAccount(CancellationToken cancellationToken)
|
||||
{
|
||||
var identity = this.GetCurrentUserIdentity();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using Aptabase.Features.Authentication;
|
||||
using Zalvena.Features.Authentication;
|
||||
|
||||
namespace Microsoft.AspNetCore.Mvc;
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
using Aptabase.Features.Notification;
|
||||
using Aptabase.Data;
|
||||
using Zalvena.Features.Notification;
|
||||
using Zalvena.Data;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||
using System.Security.Claims;
|
||||
using Dapper;
|
||||
|
||||
namespace Aptabase.Features.Authentication;
|
||||
namespace Zalvena.Features.Authentication;
|
||||
|
||||
public interface IAuthService
|
||||
{
|
||||
|
@ -53,7 +53,7 @@ public class AuthService : IAuthService
|
|||
if (user != null)
|
||||
{
|
||||
var token = _tokenManager.CreateAuthToken(AuthTokenType.SignIn, user.Name, user.Email);
|
||||
await _emailClient.SendEmailAsync(email, "Log in to Aptabase", "SignIn", new()
|
||||
await _emailClient.SendEmailAsync(email, "Log in to Zalvena", "SignIn", new()
|
||||
{
|
||||
{ "name", user.Name },
|
||||
{ "url", GenerateAuthUrl(token) }
|
||||
|
|
|
@ -2,7 +2,7 @@ using Microsoft.IdentityModel.Tokens;
|
|||
using System.IdentityModel.Tokens.Jwt;
|
||||
using System.Security.Claims;
|
||||
|
||||
namespace Aptabase.Features.Authentication;
|
||||
namespace Zalvena.Features.Authentication;
|
||||
|
||||
public enum AuthTokenType
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
|
||||
namespace Aptabase.Features.Authentication;
|
||||
namespace Zalvena.Features.Authentication;
|
||||
|
||||
public class IsAuthenticatedAttribute : ActionFilterAttribute
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using System.Net.Http.Headers;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using Aptabase.Features;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Zalvena.Features;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Microsoft.AspNetCore.Authentication.OAuth;
|
||||
|
||||
namespace Microsoft.AspNetCore.Authentication;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using System.Text;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace Aptabase.Features.Authentication;
|
||||
namespace Zalvena.Features.Authentication;
|
||||
|
||||
public class UserAccount
|
||||
{
|
||||
|
@ -31,6 +31,6 @@ public class UserAccount
|
|||
foreach (var b in hash)
|
||||
sb.Append(b.ToString("x2"));
|
||||
|
||||
return $"https://md.sudovanilla.org/images/icons/Aptabase.jpg";
|
||||
return $"https://md.sudovanilla.org/images/logos/zalvena/zalvena-avatar.png";
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Authentication;
|
||||
namespace Zalvena.Features.Authentication;
|
||||
|
||||
public struct UserIdentity
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
using Aptabase.Features.Authentication;
|
||||
using Aptabase.Features.Billing.LemonSqueezy;
|
||||
using Aptabase.Features.Stats;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Zalvena.Features.Billing.LemonSqueezy;
|
||||
using Zalvena.Features.Stats;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
[ApiController, IsAuthenticated]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
using Aptabase.Data;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Aptabase.Features.Stats;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Zalvena.Features.Stats;
|
||||
using Dapper;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public interface IBillingQueries
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public class BillingUsage
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using System.Text.Json;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Yoh.Text.Json.NamingPolicies;
|
||||
|
||||
namespace Aptabase.Features.Billing.LemonSqueezy;
|
||||
namespace Zalvena.Features.Billing.LemonSqueezy;
|
||||
|
||||
public class LemonSqueezyClient
|
||||
{
|
||||
|
@ -37,7 +37,7 @@ public class LemonSqueezyClient
|
|||
}
|
||||
},
|
||||
product_options = new {
|
||||
redirect_url = $"{_env.SelfBaseUrl}/billing",
|
||||
redirect_url = $"{_env.SelfBaseUrl}/profile",
|
||||
},
|
||||
checkout_options = new {
|
||||
embed = false,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Net.Http.Headers;
|
||||
|
||||
namespace Aptabase.Features.Billing.LemonSqueezy;
|
||||
namespace Zalvena.Features.Billing.LemonSqueezy;
|
||||
|
||||
public static class LemonSqueezyExtensions
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Billing.LemonSqueezy;
|
||||
namespace Zalvena.Features.Billing.LemonSqueezy;
|
||||
|
||||
public class PagedList<T> where T : new()
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text.Json.Nodes;
|
||||
|
||||
namespace Aptabase.Features.Billing.LemonSqueezy;
|
||||
namespace Zalvena.Features.Billing.LemonSqueezy;
|
||||
|
||||
public class WebhookEvent
|
||||
{
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
using Aptabase.Data;
|
||||
using Aptabase.Features.Billing.LemonSqueezy;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Features.Billing.LemonSqueezy;
|
||||
using Dapper;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
[ApiController]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using Aptabase.Features.Notification;
|
||||
using Zalvena.Features.Notification;
|
||||
using Features.Cache;
|
||||
using Sgbj.Cron;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public class OveruseNotificationCronJob : BackgroundService
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using Sgbj.Cron;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public class ResetOveruseCronJob : BackgroundService
|
||||
{
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public class Subscription
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using Sgbj.Cron;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public class TrialExpiredCronJob : BackgroundService
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Aptabase.Features.Notification;
|
||||
using Zalvena.Features.Notification;
|
||||
using Sgbj.Cron;
|
||||
|
||||
namespace Aptabase.Features.Billing;
|
||||
namespace Zalvena.Features.Billing;
|
||||
|
||||
public class TrialNotificationCronJob : BackgroundService
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using Aptabase.Data;
|
||||
using Zalvena.Data;
|
||||
using ClickHouse.Client.Utility;
|
||||
using Dapper;
|
||||
|
||||
namespace Aptabase.Features.Blob;
|
||||
namespace Zalvena.Features.Blob;
|
||||
|
||||
public class DatabaseBlobService : IBlobService
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Blob;
|
||||
namespace Zalvena.Features.Blob;
|
||||
|
||||
public class Blob
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using Aptabase.Features.Blob;
|
||||
using Zalvena.Features.Blob;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Aptabase.Features.Blob;
|
||||
namespace Zalvena.Features.Blob;
|
||||
|
||||
public class UploadedFile
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using Aptabase.Data;
|
||||
using Zalvena.Data;
|
||||
using Dapper;
|
||||
|
||||
namespace Features.Cache;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text;
|
||||
|
||||
namespace Aptabase.Features;
|
||||
namespace Zalvena.Features;
|
||||
|
||||
public class EnvSettings
|
||||
{
|
||||
|
@ -10,7 +10,7 @@ public class EnvSettings
|
|||
public string SelfBaseUrl { get; private set; } = "";
|
||||
|
||||
// The full connection string to postgres using .NET format
|
||||
// E.g: Server=localhost;Port=5444;User Id=aptabase;Password=aptabase_pw;Database=aptabase
|
||||
// E.g: Server=localhost;Port=5444;User Id=zalvena;Password=zalvena_pw;Database=zalvena
|
||||
// Variable Name: DATABASE_URL
|
||||
public string ConnectionString { get; private set; } = "";
|
||||
|
||||
|
@ -76,7 +76,7 @@ public class EnvSettings
|
|||
public string OAuthGoogleClientSecret { get; private set; } = "";
|
||||
|
||||
// The following properties are derived from the other settings
|
||||
public bool IsManagedCloud => Region == "EU" || Region == "US";
|
||||
public bool IsManagedCloud => Region == "Mars";
|
||||
public bool IsBillingEnabled => IsManagedCloud || IsDevelopment;
|
||||
public bool IsProduction => !IsDevelopment;
|
||||
public bool IsDevelopment { get; private set; }
|
||||
|
@ -88,14 +88,14 @@ public class EnvSettings
|
|||
public static EnvSettings Load()
|
||||
{
|
||||
var isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";
|
||||
var region = isDevelopment ? "DEV" : Get("REGION").ToUpper();
|
||||
var region = isDevelopment ? "DEV" : Get("REGION");
|
||||
if (string.IsNullOrEmpty(region))
|
||||
region = "ZV"; // Self Hosted
|
||||
region = "SH"; // Self Hosted
|
||||
|
||||
return new EnvSettings
|
||||
{
|
||||
IsDevelopment = isDevelopment,
|
||||
Region = region,
|
||||
Region = Get("REGION"),
|
||||
SelfBaseUrl = MustGet("BASE_URL"),
|
||||
ConnectionString = GetOrNull("ConnectionStrings__postgresdb") ?? MustGet("DATABASE_URL"),
|
||||
ClickHouseConnectionString = GetOrNull("ConnectionStrings__clickhousedb") ?? Get("CLICKHOUSE_URL"),
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
using Aptabase.Features.Authentication;
|
||||
using Aptabase.Features.Stats;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Zalvena.Features.Stats;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Aptabase.Features.Export;
|
||||
namespace Zalvena.Features.Export;
|
||||
|
||||
public class DownloadRequest
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Aptabase.Features.Export;
|
||||
namespace Zalvena.Features.Export;
|
||||
|
||||
public class StreamingFileResult(Func<Stream, HttpContext, CancellationToken, Task> streamContent, string contentType, string fileName) : IActionResult
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.FeatureFlags
|
||||
namespace Zalvena.Features.FeatureFlags
|
||||
{
|
||||
public class FeatureFlag
|
||||
{
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
using Aptabase.Data;
|
||||
using Aptabase.Features.Ingestion;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Features.Ingestion;
|
||||
using Dapper;
|
||||
using Microsoft.AspNetCore.Cors;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.RateLimiting;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Aptabase.Features.FeatureFlags;
|
||||
namespace Zalvena.Features.FeatureFlags;
|
||||
|
||||
public class GetFeatureFlagBody
|
||||
{
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
using Aptabase.Data;
|
||||
using Aptabase.Features.Apps;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Features.Apps;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Dapper;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Aptabase.Features.FeatureFlags;
|
||||
namespace Zalvena.Features.FeatureFlags;
|
||||
|
||||
public class CreateFeatureFlagRequestBody : UpdateFeatureFlagRequestBody
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text.Json;
|
||||
|
||||
namespace Aptabase.Features.GeoIP;
|
||||
namespace Zalvena.Features.GeoIP;
|
||||
|
||||
public class CloudGeoClient : GeoIPClient
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using MaxMind.GeoIP2;
|
||||
|
||||
namespace Aptabase.Features.GeoIP;
|
||||
namespace Zalvena.Features.GeoIP;
|
||||
|
||||
public class DatabaseGeoClient : GeoIPClient
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.GeoIP;
|
||||
namespace Zalvena.Features.GeoIP;
|
||||
|
||||
public static class GeoIPExtensions
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Aptabase.Features.GeoIP;
|
||||
namespace Zalvena.Features.GeoIP;
|
||||
|
||||
public readonly struct GeoLocation
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@ using Dapper;
|
|||
using ClickHouse.Client.Copy;
|
||||
using ClickHouse.Client.ADO;
|
||||
|
||||
namespace Aptabase.Features.Ingestion.Buffer;
|
||||
namespace Zalvena.Features.Ingestion.Buffer;
|
||||
|
||||
public class ClickHouseIngestionClient : IIngestionClient
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
|
||||
|
||||
using System.Diagnostics;
|
||||
using Aptabase.Features.Privacy;
|
||||
using Zalvena.Features.Privacy;
|
||||
|
||||
namespace Aptabase.Features.Ingestion.Buffer;
|
||||
namespace Zalvena.Features.Ingestion.Buffer;
|
||||
|
||||
public class EventBackgroundWritter : BackgroundService
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text.Json;
|
||||
|
||||
namespace Aptabase.Features.Ingestion.Buffer;
|
||||
namespace Zalvena.Features.Ingestion.Buffer;
|
||||
|
||||
public readonly struct EventRow
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Ingestion.Buffer;
|
||||
namespace Zalvena.Features.Ingestion.Buffer;
|
||||
|
||||
public interface IIngestionClient
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Ingestion.Buffer;
|
||||
namespace Zalvena.Features.Ingestion.Buffer;
|
||||
|
||||
public interface IEventBuffer
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Aptabase.Features.Ingestion.Buffer;
|
||||
namespace Zalvena.Features.Ingestion.Buffer;
|
||||
|
||||
public class InsertResult
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text.Json;
|
||||
|
||||
namespace Aptabase.Features.Ingestion;
|
||||
namespace Zalvena.Features.Ingestion;
|
||||
|
||||
public readonly struct TrackingEvent
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@ using System.ComponentModel.DataAnnotations;
|
|||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
|
||||
namespace Aptabase.Features.Ingestion;
|
||||
namespace Zalvena.Features.Ingestion;
|
||||
|
||||
public class SystemProperties
|
||||
{
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
using Aptabase.Features.GeoIP;
|
||||
using Aptabase.Features.Ingestion.Buffer;
|
||||
using Zalvena.Features.GeoIP;
|
||||
using Zalvena.Features.Ingestion.Buffer;
|
||||
using Microsoft.AspNetCore.Cors;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.RateLimiting;
|
||||
|
||||
namespace Aptabase.Features.Ingestion;
|
||||
namespace Zalvena.Features.Ingestion;
|
||||
|
||||
[ApiController]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Aptabase.Features.Apps;
|
||||
using Zalvena.Features.Apps;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
|
||||
namespace Aptabase.Features.Ingestion;
|
||||
namespace Zalvena.Features.Ingestion;
|
||||
|
||||
public class CachedApplication
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Ingestion;
|
||||
namespace Zalvena.Features.Ingestion;
|
||||
|
||||
public static class LocaleFormatter
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Aptabase.Features.Ingestion;
|
||||
namespace Zalvena.Features.Ingestion;
|
||||
|
||||
public static class UserAgentParser
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public interface IEmailClient
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public class LoggerEmailClient : IEmailClient
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System.Net.Mail;
|
||||
|
||||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public class MailCatcherSmtpClient : IEmailClient
|
||||
{
|
||||
|
@ -16,7 +16,7 @@ public class MailCatcherSmtpClient : IEmailClient
|
|||
{
|
||||
var body = await _engine.Render(templateName, subject, properties);
|
||||
|
||||
using var message = new MailMessage("hi@aptabase.com", to)
|
||||
using var message = new MailMessage("zalvena@sudovanilla.org", to)
|
||||
{
|
||||
Subject = subject,
|
||||
Body = body
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public static class NotificationExtensions
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@ using Amazon.Runtime.CredentialManagement;
|
|||
using Amazon.SimpleEmail;
|
||||
using Amazon.SimpleEmail.Model;
|
||||
|
||||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public class SESEmailClient : IEmailClient
|
||||
{
|
||||
|
@ -29,8 +29,8 @@ public class SESEmailClient : IEmailClient
|
|||
return new AmazonSimpleEmailServiceClient();
|
||||
|
||||
var chain = new CredentialProfileStoreChain();
|
||||
if (!chain.TryGetAWSCredentials("aptabase", out var credentials))
|
||||
throw new Exception("Failed to find the aptabase profile");
|
||||
if (!chain.TryGetAWSCredentials("zalvena", out var credentials))
|
||||
throw new Exception("Failed to find the zalvena profile");
|
||||
|
||||
return new AmazonSimpleEmailServiceClient(credentials, Amazon.RegionEndpoint.USEast1);
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ public class SESEmailClient : IEmailClient
|
|||
{
|
||||
return new SendEmailRequest
|
||||
{
|
||||
Source = "Aptabase <goenning@aptabase.com>",
|
||||
Source = "Zalvena <zalvena@sudovanilla.org>",
|
||||
Destination = new Destination
|
||||
{
|
||||
ToAddresses =
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using MimeKit;
|
||||
using MailKit.Net.Smtp;
|
||||
|
||||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public class SmtpEmailClient : IEmailClient
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@ using System.Reflection;
|
|||
using System.Text;
|
||||
using System.Web;
|
||||
|
||||
namespace Aptabase.Features.Notification;
|
||||
namespace Zalvena.Features.Notification;
|
||||
|
||||
public class TemplateEngine
|
||||
{
|
||||
|
@ -28,7 +28,7 @@ public class TemplateEngine
|
|||
if (_templates.ContainsKey(name))
|
||||
return _templates[name];
|
||||
|
||||
var resourceStream = _assembly.GetManifestResourceStream($"Aptabase.assets.Templates.{name}.html");
|
||||
var resourceStream = _assembly.GetManifestResourceStream($"Zalvena.assets.Templates.{name}.html");
|
||||
if (resourceStream == null)
|
||||
throw new Exception($"Failed to find the embedded resource named {name}");
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
using Aptabase.Data;
|
||||
using Zalvena.Data;
|
||||
using System.Text;
|
||||
using System.Security.Cryptography;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Dapper;
|
||||
using FastHashes;
|
||||
|
||||
namespace Aptabase.Features.Privacy;
|
||||
namespace Zalvena.Features.Privacy;
|
||||
|
||||
public interface IUserHasher
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Aptabase.Data;
|
||||
using Zalvena.Data;
|
||||
using Dapper;
|
||||
|
||||
namespace Aptabase.Features.Privacy;
|
||||
namespace Zalvena.Features.Privacy;
|
||||
|
||||
public interface IPrivacyQueries
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using Sgbj.Cron;
|
||||
|
||||
namespace Aptabase.Features.Privacy;
|
||||
namespace Zalvena.Features.Privacy;
|
||||
|
||||
public class PurgeDailySaltsCronJob : BackgroundService
|
||||
{
|
||||
|
|
|
@ -3,7 +3,7 @@ using Scriban;
|
|||
using ClickHouse.Client.ADO;
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public class ClickHouseQueryClient : IQueryClient
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
|
||||
using Aptabase.Data;
|
||||
using Zalvena.Data;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
|
||||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public class HasReadAccessToApp : ActionFilterAttribute
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public interface IQueryClient
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
using Aptabase.Features.Authentication;
|
||||
using Aptabase.Features.GeoIP;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Zalvena.Features.GeoIP;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.RateLimiting;
|
||||
|
||||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public record PeriodicStatsRow
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
using Dapper;
|
||||
using Aptabase.Data;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Features.Authentication;
|
||||
|
||||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public static class StatsQueries
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@ using System.Globalization;
|
|||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public class TinybirdDateTimeJsonConverter : JsonConverter<DateTime>
|
||||
{
|
||||
|
|
|
@ -3,7 +3,7 @@ using System.Text.Json;
|
|||
using System.Text.Json.Serialization;
|
||||
using Microsoft.AspNetCore.Http.Extensions;
|
||||
|
||||
namespace Aptabase.Features.Stats;
|
||||
namespace Zalvena.Features.Stats;
|
||||
|
||||
public class QueryResult<T>
|
||||
{
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
using Aptabase.Data;
|
||||
using Aptabase.Data.Migrations;
|
||||
using Aptabase.Features;
|
||||
using Aptabase.Features.Apps;
|
||||
using Aptabase.Features.Authentication;
|
||||
using Aptabase.Features.Billing;
|
||||
using Aptabase.Features.Billing.LemonSqueezy;
|
||||
using Aptabase.Features.Blob;
|
||||
using Aptabase.Features.GeoIP;
|
||||
using Aptabase.Features.Ingestion;
|
||||
using Aptabase.Features.Ingestion.Buffer;
|
||||
using Aptabase.Features.Notification;
|
||||
using Aptabase.Features.Privacy;
|
||||
using Aptabase.Features.Stats;
|
||||
using Zalvena.Data;
|
||||
using Zalvena.Data.Migrations;
|
||||
using Zalvena.Features;
|
||||
using Zalvena.Features.Apps;
|
||||
using Zalvena.Features.Authentication;
|
||||
using Zalvena.Features.Billing;
|
||||
using Zalvena.Features.Billing.LemonSqueezy;
|
||||
using Zalvena.Features.Blob;
|
||||
using Zalvena.Features.GeoIP;
|
||||
using Zalvena.Features.Ingestion;
|
||||
using Zalvena.Features.Ingestion.Buffer;
|
||||
using Zalvena.Features.Notification;
|
||||
using Zalvena.Features.Privacy;
|
||||
using Zalvena.Features.Stats;
|
||||
using ClickHouse.Client.ADO;
|
||||
using Features.Cache;
|
||||
using FluentMigrator.Runner;
|
||||
|
@ -48,9 +48,17 @@ public partial class Program
|
|||
|
||||
builder.Services.AddCors(options =>
|
||||
{
|
||||
options.AddPolicy(name: "AllowAptabaseCom", policy =>
|
||||
options.AddPolicy(name: "AllowZalvenaOrg", policy =>
|
||||
{
|
||||
policy.WithOrigins("https://aptabase.com")
|
||||
policy.WithOrigins("https://events.sudovanilla.org") // Official Zalvena Instance
|
||||
.WithMethods("GET")
|
||||
.AllowCredentials()
|
||||
.SetPreflightMaxAge(TimeSpan.FromHours(1));
|
||||
});
|
||||
|
||||
options.AddPolicy(name: "AllowZalvenaOrg", policy =>
|
||||
{
|
||||
policy.WithOrigins("https://beta.events.sudovanilla.org") // Development Only
|
||||
.WithMethods("GET")
|
||||
.AllowCredentials()
|
||||
.SetPreflightMaxAge(TimeSpan.FromHours(1));
|
||||
|
@ -68,7 +76,7 @@ public partial class Program
|
|||
if (appEnv.IsManagedCloud)
|
||||
{
|
||||
builder.Services.AddDataProtection()
|
||||
.PersistKeysToAWSSystemsManager("/aptabase/production/aspnet-dataprotection/");
|
||||
.PersistKeysToAWSSystemsManager("/zalvena/production/aspnet-dataprotection/");
|
||||
}
|
||||
|
||||
builder.Services.AddControllers();
|
||||
|
|
|
@ -1,7 +1,147 @@
|
|||
<p>Hi ##NAME##,</p>
|
||||
<p>You asked for a magic link to Zalvena and here it is.</p>
|
||||
<p>
|
||||
<a target="_blank" rel="noopener noreferrer nofollow" href="##URL##">Confirm your registration</a>
|
||||
</p>
|
||||
<p></p>
|
||||
<p>This link will only be valid for the next 15 minutes.</p>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" data-astro-cid-sckkx6r4>
|
||||
<head>
|
||||
<meta charset="utf-8"> <!-- utf-8 works for most cases -->
|
||||
<meta name="viewport" content="width=device-width"> <!-- Forcing initial-scale shouldn't be necessary -->
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Use the latest (edge) version of IE rendering engine -->
|
||||
<meta name="x-apple-disable-message-reformatting"> <!-- Disable auto-scale in iOS 10 Mail entirely -->
|
||||
<meta name="format-detection" content="telephone=no,address=no,email=no,date=no,url=no"> <!-- Tell iOS not to automatically link certain text strings. -->
|
||||
<meta name="color-scheme" content="dark">
|
||||
<meta name="supported-color-schemes" content="dark">
|
||||
<title></title> <!-- The title tag shows in email notifications, like Android 4.4. -->
|
||||
|
||||
<!-- What it does: Makes background images in 72ppi Outlook render at correct size. -->
|
||||
<!--[if gte mso 9]>
|
||||
<xml>
|
||||
<o:OfficeDocumentSettings>
|
||||
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||
</o:OfficeDocumentSettings>
|
||||
</xml>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Web Font / @font-face : BEGIN -->
|
||||
<!-- NOTE: If web fonts are not required, lines 23 - 41 can be safely removed. -->
|
||||
|
||||
<!-- Desktop Outlook chokes on web font references and defaults to Times New Roman, so we force a safe fallback font. -->
|
||||
<!--[if mso]>
|
||||
<style>
|
||||
* {
|
||||
font-family: sans-serif !important;
|
||||
}
|
||||
</style>
|
||||
<![endif]-->
|
||||
|
||||
<!-- All other clients get the webfont reference; some will render the font and others will silently fail to the fallbacks. More on that here: https://web.archive.org/web/20190717120616/http://stylecampaign.com/blog/2015/02/webfont-support-in-email/ -->
|
||||
<!--[if !mso]><!-->
|
||||
<!-- insert web font reference, eg: <link href='https://fonts.googleapis.com/css?family=Roboto:400,700' rel='stylesheet' type='text/css'> -->
|
||||
<!--<![endif]-->
|
||||
|
||||
<!-- Web Font / @font-face : END -->
|
||||
|
||||
<!-- CSS Reset : BEGIN -->
|
||||
|
||||
<!-- CSS Reset : END -->
|
||||
|
||||
<!-- Progressive Enhancements : BEGIN -->
|
||||
|
||||
<!-- Progressive Enhancements : END -->
|
||||
|
||||
<style>.button-td[data-astro-cid-sckkx6r4],.button-a[data-astro-cid-sckkx6r4]{transition:all .1s ease-in}.button-td-primary[data-astro-cid-sckkx6r4]:hover,.button-a-primary[data-astro-cid-sckkx6r4]:hover{background:#555!important;border-color:#555!important}@media screen and (max-width: 480px){.stack-column[data-astro-cid-sckkx6r4],.stack-column-center[data-astro-cid-sckkx6r4]{display:block!important;width:100%!important;max-width:100%!important;direction:ltr!important}.stack-column-center[data-astro-cid-sckkx6r4]{text-align:center!important}.center-on-narrow[data-astro-cid-sckkx6r4]{text-align:center!important;display:block!important;margin-left:auto!important;margin-right:auto!important;float:none!important}table[data-astro-cid-sckkx6r4].center-on-narrow{display:inline-block!important}.email-container[data-astro-cid-sckkx6r4] p[data-astro-cid-sckkx6r4]{font-size:17px!important}}@media (prefers-color-scheme: dark){.email-bg[data-astro-cid-sckkx6r4]{background:#111!important}.darkmode-bg[data-astro-cid-sckkx6r4]{background:#222!important}h1[data-astro-cid-sckkx6r4],h2[data-astro-cid-sckkx6r4],h3[data-astro-cid-sckkx6r4],p[data-astro-cid-sckkx6r4],li[data-astro-cid-sckkx6r4],.darkmode-text[data-astro-cid-sckkx6r4],.email-container[data-astro-cid-sckkx6r4] a[data-astro-cid-sckkx6r4]:not([class]){color:#f7f7f9!important}td[data-astro-cid-sckkx6r4].button-td-primary,td[data-astro-cid-sckkx6r4].button-td-primary a[data-astro-cid-sckkx6r4]{background:#fff!important;border-color:#fff!important;color:#222!important}td[data-astro-cid-sckkx6r4].button-td-primary:hover,td[data-astro-cid-sckkx6r4].button-td-primary a[data-astro-cid-sckkx6r4]:hover{background:#ccc!important;border-color:#ccc!important}.footer[data-astro-cid-sckkx6r4] td[data-astro-cid-sckkx6r4]{color:#aaa!important}.darkmode-fullbleed-bg[data-astro-cid-sckkx6r4]{background-color:#0f3016!important}}:root{color-scheme:light dark;supported-color-schemes:light dark}html,body{margin:0 auto!important;padding:0!important;height:100%!important;width:100%!important}[data-astro-cid-sckkx6r4]{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}div[data-astro-cid-sckkx6r4][style*="margin: 16px 0"]{margin:0!important}#MessageViewBody[data-astro-cid-sckkx6r4],#MessageWebViewDiv[data-astro-cid-sckkx6r4]{width:100%!important}table[data-astro-cid-sckkx6r4],td[data-astro-cid-sckkx6r4]{mso-table-lspace:0pt!important;mso-table-rspace:0pt!important}table[data-astro-cid-sckkx6r4]{border-spacing:0!important;border-collapse:collapse!important;table-layout:fixed!important;margin:0 auto!important}img[data-astro-cid-sckkx6r4]{-ms-interpolation-mode:bicubic}a[data-astro-cid-sckkx6r4]{text-decoration:none}a[data-astro-cid-sckkx6r4][x-apple-data-detectors],.unstyle-auto-detected-links[data-astro-cid-sckkx6r4] a[data-astro-cid-sckkx6r4],.aBn[data-astro-cid-sckkx6r4]{border-bottom:0!important;cursor:default!important;color:inherit!important;text-decoration:none!important;font-size:inherit!important;font-family:inherit!important;font-weight:inherit!important;line-height:inherit!important}.im[data-astro-cid-sckkx6r4]{color:inherit!important}.a6S[data-astro-cid-sckkx6r4]{display:none!important;opacity:.01!important}img[data-astro-cid-sckkx6r4].g-img+div[data-astro-cid-sckkx6r4]{display:none!important}@media only screen and (min-device-width: 320px) and (max-device-width: 374px){u[data-astro-cid-sckkx6r4]~div[data-astro-cid-sckkx6r4] .email-container[data-astro-cid-sckkx6r4]{min-width:320px!important}}@media only screen and (min-device-width: 375px) and (max-device-width: 413px){u[data-astro-cid-sckkx6r4]~div[data-astro-cid-sckkx6r4] .email-container[data-astro-cid-sckkx6r4]{min-width:375px!important}}@media only screen and (min-device-width: 414px){u[data-astro-cid-sckkx6r4]~div[data-astro-cid-sckkx6r4] .email-container[data-astro-cid-sckkx6r4]{min-width:414px!important}}
|
||||
</style></head>
|
||||
<!--
|
||||
The email background color (rgba(255,255,255,0.25)) is defined in three places:
|
||||
1. body tag: for most email clients
|
||||
2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr
|
||||
3. mso conditional: For Windows 10 Mail
|
||||
-->
|
||||
<body width="100%" style="margin: 0px; padding: 0 !important; mso-line-height-rule: exactly; background-color: rgba(255,255,255,0.25);" class="email-bg" data-astro-cid-sckkx6r4>
|
||||
<center role="article" aria-roledescription="email" lang="en" style="width: 100%; background-color: rgba(255,255,255,0.25);" class="email-bg" data-astro-cid-sckkx6r4>
|
||||
<!--[if mso | IE]>
|
||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color: rgba(255,255,255,0.25);" class="email-bg">
|
||||
<tr>
|
||||
<td>
|
||||
<![endif]-->
|
||||
<!--
|
||||
Set the email width. Defined in two places:
|
||||
1. max-width for all clients except Desktop Windows Outlook, allowing the email to squish on narrow but never go wider than 680px.
|
||||
2. MSO tags for Desktop Windows Outlook enforce a 680px width.
|
||||
Note: The Fluid and Responsive templates have a different width (600px). The hybrid grid is more "fragile", and I've found that 680px is a good width. Change with caution.
|
||||
-->
|
||||
<div style="max-width: 680px; margin: 0 auto;" class="email-container" data-astro-cid-sckkx6r4>
|
||||
<!--[if mso]>
|
||||
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="680">
|
||||
<tr>
|
||||
<td>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Email Body : BEGIN -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto; padding: 0px 24px;" data-astro-cid-sckkx6r4>
|
||||
<!-- Email Header : BEGIN -->
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="padding: 20px 0; text-align: center" data-astro-cid-sckkx6r4></td>
|
||||
</tr>
|
||||
<!-- Email Header : END -->
|
||||
|
||||
<!-- Hero Image, Flush : BEGIN -->
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="background-color: #ffffff;" class="darkmode-bg" data-astro-cid-sckkx6r4>
|
||||
<img src="https://ocean.sudovanilla.org/media/images/wallpapers/Trenta%20OS%20(Discontinued)/mountains.jpg" width="680" height="" alt="SudoVanilla Gateway - Email Banner" border="0" style="border-radius: 12px; width: 100%; max-width: 680px; height: auto; background: #dddddd; font-family: sans-serif; font-size: 15px; line-height: 15px; color: #555555; margin: auto; display: block;" class="g-img" data-astro-cid-sckkx6r4>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- Hero Image, Flush : END -->
|
||||
|
||||
<!-- 1 Column Text + Button : BEGIN -->
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="background-color: #ffffff;" class="darkmode-bg" data-astro-cid-sckkx6r4>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" data-astro-cid-sckkx6r4>
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="padding: 20px; font-family: sans-serif; font-size: 15px; line-height: 20px; color: #555555;" data-astro-cid-sckkx6r4>
|
||||
<h1 style="margin: 0 0 10px; font-size: 25px; line-height: 30px; color: #333333; font-weight: normal;" data-astro-cid-sckkx6r4>Confirm Registration for Zalvena</h1>
|
||||
<p style="margin: 0 0 10px;" data-astro-cid-sckkx6r4>Welcome to the Zalvena! Looks like you're trying to create a new account here, click the link below to continue setting up your account. After that, create an application and use the app key in your application.</p>
|
||||
|
||||
<a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>Confirm Email</a>
|
||||
|
||||
<p style="margin: 0 0 10px;" data-astro-cid-sckkx6r4>If you did not register an account on the Zalvena, please ignore it. The code will only be valid for 15 minutes.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- 1 Column Text + Button : END -->
|
||||
|
||||
</table><a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>
|
||||
<!-- Email Body : END -->
|
||||
|
||||
<!-- Email Footer : BEGIN -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 680px;" class="footer" data-astro-cid-sckkx6r4>
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="padding: 20px; font-family: sans-serif; font-size: 12px; line-height: 15px; text-align: center;" data-astro-cid-sckkx6r4>
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://zalvena.sudovanilla.org/" data-astro-cid-sckkx6r4>Website</a> |
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://sudovanilla.org/terms-of-service/zalvena" data-astro-cid-sckkx6r4>Terms of Service</a> |
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://sudovanilla.org/privacy-policy/zalvena" data-astro-cid-sckkx6r4>Privacy Policy</a> |
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://sudovanilla.org/umbrella-policy/" data-astro-cid-sckkx6r4>Umbrella Policy</a>
|
||||
<br data-astro-cid-sckkx6r4>
|
||||
<br data-astro-cid-sckkx6r4>
|
||||
<!-- <webversion style="color: #ffffff; text-decoration: underline; font-weight: bold;">View as a Web Page</webversion>
|
||||
<br><br> -->
|
||||
<p style="color: gray" data-astro-cid-sckkx6r4>(C) SudoVanilla 2014 - 2025</p>
|
||||
<br data-astro-cid-sckkx6r4><br data-astro-cid-sckkx6r4>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- Email Footer : END -->
|
||||
|
||||
<!--[if mso]>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<![endif]-->
|
||||
</a></div><a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>
|
||||
|
||||
<!--[if mso | IE]>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<![endif]-->
|
||||
</a></center><a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>
|
||||
</a></body></html>
|
|
@ -1,7 +1,150 @@
|
|||
<p>Hi ##NAME##,</p>
|
||||
<p>You asked for a magic link and here it is.</p>
|
||||
<p>
|
||||
<a target="_blank" rel="noopener noreferrer nofollow" href="##URL##">Log in to Aptabase</a>
|
||||
</p>
|
||||
<p></p>
|
||||
<p>This link will only be valid for the next 15 minutes.</p>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" data-astro-cid-sckkx6r4>
|
||||
<head>
|
||||
<meta charset="utf-8"> <!-- utf-8 works for most cases -->
|
||||
<meta name="viewport" content="width=device-width"> <!-- Forcing initial-scale shouldn't be necessary -->
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Use the latest (edge) version of IE rendering engine -->
|
||||
<meta name="x-apple-disable-message-reformatting"> <!-- Disable auto-scale in iOS 10 Mail entirely -->
|
||||
<meta name="format-detection" content="telephone=no,address=no,email=no,date=no,url=no"> <!-- Tell iOS not to automatically link certain text strings. -->
|
||||
<meta name="color-scheme" content="dark">
|
||||
<meta name="supported-color-schemes" content="dark">
|
||||
<title></title> <!-- The title tag shows in email notifications, like Android 4.4. -->
|
||||
|
||||
<!-- What it does: Makes background images in 72ppi Outlook render at correct size. -->
|
||||
<!--[if gte mso 9]>
|
||||
<xml>
|
||||
<o:OfficeDocumentSettings>
|
||||
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||
</o:OfficeDocumentSettings>
|
||||
</xml>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Web Font / @font-face : BEGIN -->
|
||||
<!-- NOTE: If web fonts are not required, lines 23 - 41 can be safely removed. -->
|
||||
|
||||
<!-- Desktop Outlook chokes on web font references and defaults to Times New Roman, so we force a safe fallback font. -->
|
||||
<!--[if mso]>
|
||||
<style>
|
||||
* {
|
||||
font-family: sans-serif !important;
|
||||
}
|
||||
</style>
|
||||
<![endif]-->
|
||||
|
||||
<!-- All other clients get the webfont reference; some will render the font and others will silently fail to the fallbacks. More on that here: https://web.archive.org/web/20190717120616/http://stylecampaign.com/blog/2015/02/webfont-support-in-email/ -->
|
||||
<!--[if !mso]><!-->
|
||||
<!-- insert web font reference, eg: <link href='https://fonts.googleapis.com/css?family=Roboto:400,700' rel='stylesheet' type='text/css'> -->
|
||||
<!--<![endif]-->
|
||||
|
||||
<!-- Web Font / @font-face : END -->
|
||||
|
||||
<!-- CSS Reset : BEGIN -->
|
||||
|
||||
<!-- CSS Reset : END -->
|
||||
|
||||
<!-- Progressive Enhancements : BEGIN -->
|
||||
|
||||
<!-- Progressive Enhancements : END -->
|
||||
|
||||
<style>.button-td[data-astro-cid-sckkx6r4],.button-a[data-astro-cid-sckkx6r4]{transition:all .1s ease-in}.button-td-primary[data-astro-cid-sckkx6r4]:hover,.button-a-primary[data-astro-cid-sckkx6r4]:hover{background:#555!important;border-color:#555!important}@media screen and (max-width: 480px){.stack-column[data-astro-cid-sckkx6r4],.stack-column-center[data-astro-cid-sckkx6r4]{display:block!important;width:100%!important;max-width:100%!important;direction:ltr!important}.stack-column-center[data-astro-cid-sckkx6r4]{text-align:center!important}.center-on-narrow[data-astro-cid-sckkx6r4]{text-align:center!important;display:block!important;margin-left:auto!important;margin-right:auto!important;float:none!important}table[data-astro-cid-sckkx6r4].center-on-narrow{display:inline-block!important}.email-container[data-astro-cid-sckkx6r4] p[data-astro-cid-sckkx6r4]{font-size:17px!important}}@media (prefers-color-scheme: dark){.email-bg[data-astro-cid-sckkx6r4]{background:#111!important}.darkmode-bg[data-astro-cid-sckkx6r4]{background:#222!important}h1[data-astro-cid-sckkx6r4],h2[data-astro-cid-sckkx6r4],h3[data-astro-cid-sckkx6r4],p[data-astro-cid-sckkx6r4],li[data-astro-cid-sckkx6r4],.darkmode-text[data-astro-cid-sckkx6r4],.email-container[data-astro-cid-sckkx6r4] a[data-astro-cid-sckkx6r4]:not([class]){color:#f7f7f9!important}td[data-astro-cid-sckkx6r4].button-td-primary,td[data-astro-cid-sckkx6r4].button-td-primary a[data-astro-cid-sckkx6r4]{background:#fff!important;border-color:#fff!important;color:#222!important}td[data-astro-cid-sckkx6r4].button-td-primary:hover,td[data-astro-cid-sckkx6r4].button-td-primary a[data-astro-cid-sckkx6r4]:hover{background:#ccc!important;border-color:#ccc!important}.footer[data-astro-cid-sckkx6r4] td[data-astro-cid-sckkx6r4]{color:#aaa!important}.darkmode-fullbleed-bg[data-astro-cid-sckkx6r4]{background-color:#0f3016!important}}:root{color-scheme:light dark;supported-color-schemes:light dark}html,body{margin:0 auto!important;padding:0!important;height:100%!important;width:100%!important}[data-astro-cid-sckkx6r4]{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}div[data-astro-cid-sckkx6r4][style*="margin: 16px 0"]{margin:0!important}#MessageViewBody[data-astro-cid-sckkx6r4],#MessageWebViewDiv[data-astro-cid-sckkx6r4]{width:100%!important}table[data-astro-cid-sckkx6r4],td[data-astro-cid-sckkx6r4]{mso-table-lspace:0pt!important;mso-table-rspace:0pt!important}table[data-astro-cid-sckkx6r4]{border-spacing:0!important;border-collapse:collapse!important;table-layout:fixed!important;margin:0 auto!important}img[data-astro-cid-sckkx6r4]{-ms-interpolation-mode:bicubic}a[data-astro-cid-sckkx6r4]{text-decoration:none}a[data-astro-cid-sckkx6r4][x-apple-data-detectors],.unstyle-auto-detected-links[data-astro-cid-sckkx6r4] a[data-astro-cid-sckkx6r4],.aBn[data-astro-cid-sckkx6r4]{border-bottom:0!important;cursor:default!important;color:inherit!important;text-decoration:none!important;font-size:inherit!important;font-family:inherit!important;font-weight:inherit!important;line-height:inherit!important}.im[data-astro-cid-sckkx6r4]{color:inherit!important}.a6S[data-astro-cid-sckkx6r4]{display:none!important;opacity:.01!important}img[data-astro-cid-sckkx6r4].g-img+div[data-astro-cid-sckkx6r4]{display:none!important}@media only screen and (min-device-width: 320px) and (max-device-width: 374px){u[data-astro-cid-sckkx6r4]~div[data-astro-cid-sckkx6r4] .email-container[data-astro-cid-sckkx6r4]{min-width:320px!important}}@media only screen and (min-device-width: 375px) and (max-device-width: 413px){u[data-astro-cid-sckkx6r4]~div[data-astro-cid-sckkx6r4] .email-container[data-astro-cid-sckkx6r4]{min-width:375px!important}}@media only screen and (min-device-width: 414px){u[data-astro-cid-sckkx6r4]~div[data-astro-cid-sckkx6r4] .email-container[data-astro-cid-sckkx6r4]{min-width:414px!important}}
|
||||
</style></head>
|
||||
<!--
|
||||
The email background color (rgba(255,255,255,0.25)) is defined in three places:
|
||||
1. body tag: for most email clients
|
||||
2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr
|
||||
3. mso conditional: For Windows 10 Mail
|
||||
-->
|
||||
<body width="100%" style="margin: 0px; padding: 0 !important; mso-line-height-rule: exactly; background-color: rgba(255,255,255,0.25);" class="email-bg" data-astro-cid-sckkx6r4>
|
||||
<center role="article" aria-roledescription="email" lang="en" style="width: 100%; background-color: rgba(255,255,255,0.25);" class="email-bg" data-astro-cid-sckkx6r4>
|
||||
<!--[if mso | IE]>
|
||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color: rgba(255,255,255,0.25);" class="email-bg">
|
||||
<tr>
|
||||
<td>
|
||||
<![endif]-->
|
||||
<!--
|
||||
Set the email width. Defined in two places:
|
||||
1. max-width for all clients except Desktop Windows Outlook, allowing the email to squish on narrow but never go wider than 680px.
|
||||
2. MSO tags for Desktop Windows Outlook enforce a 680px width.
|
||||
Note: The Fluid and Responsive templates have a different width (600px). The hybrid grid is more "fragile", and I've found that 680px is a good width. Change with caution.
|
||||
-->
|
||||
<div style="max-width: 680px; margin: 0 auto;" class="email-container" data-astro-cid-sckkx6r4>
|
||||
<!--[if mso]>
|
||||
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="680">
|
||||
<tr>
|
||||
<td>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Email Body : BEGIN -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto; padding: 0px 24px;" data-astro-cid-sckkx6r4>
|
||||
<!-- Email Header : BEGIN -->
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="padding: 20px 0; text-align: center" data-astro-cid-sckkx6r4></td>
|
||||
</tr>
|
||||
<!-- Email Header : END -->
|
||||
|
||||
<!-- Hero Image, Flush : BEGIN -->
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="background-color: #ffffff;" class="darkmode-bg" data-astro-cid-sckkx6r4>
|
||||
<img src="https://ocean.sudovanilla.org/media/images/wallpapers/Trenta%20OS%20(Discontinued)/mountains.jpg" width="680" height="" alt="SudoVanilla Gateway - Email Banner" border="0" style="border-radius: 12px; width: 100%; max-width: 680px; height: auto; background: #dddddd; font-family: sans-serif; font-size: 15px; line-height: 15px; color: #555555; margin: auto; display: block;" class="g-img" data-astro-cid-sckkx6r4>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- Hero Image, Flush : END -->
|
||||
|
||||
<!-- 1 Column Text + Button : BEGIN -->
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="background-color: #ffffff;" class="darkmode-bg" data-astro-cid-sckkx6r4>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" data-astro-cid-sckkx6r4>
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="padding: 20px; font-family: sans-serif; font-size: 15px; line-height: 20px; color: #555555;" data-astro-cid-sckkx6r4>
|
||||
<h1 style="margin: 0 0 10px; font-size: 25px; line-height: 30px; color: #333333; font-weight: normal;" data-astro-cid-sckkx6r4>Login to your Zalvena account</h1>
|
||||
<p style="margin: 0 0 10px;" data-astro-cid-sckkx6r4>Zalvena has received a sign in attempt, click the button below to continue.</p>
|
||||
|
||||
<a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>Login to Zalvena</a>
|
||||
|
||||
<p style="margin: 0 0 10px;" data-astro-cid-sckkx6r4>If you did not attempt to sign in but received this email, please ignore it. The code will only be valid for 15 minutes.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- 1 Column Text + Button : END -->
|
||||
|
||||
</table><a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>
|
||||
<!-- Email Body : END -->
|
||||
|
||||
<!-- Email Footer : BEGIN -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 680px;" class="footer" data-astro-cid-sckkx6r4>
|
||||
<tr data-astro-cid-sckkx6r4>
|
||||
<td style="padding: 20px; font-family: sans-serif; font-size: 12px; line-height: 15px; text-align: center;" data-astro-cid-sckkx6r4>
|
||||
|
||||
|
||||
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://zalvena.sudovanilla.org/" data-astro-cid-sckkx6r4>Website</a> |
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://sudovanilla.org/terms-of-service/zalvena" data-astro-cid-sckkx6r4>Terms of Service</a> |
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://sudovanilla.org/privacy-policy/zalvena" data-astro-cid-sckkx6r4>Privacy Policy</a> |
|
||||
<a style="margin: 0px 6px" target="_blank" href="https://sudovanilla.org/umbrella-policy/" data-astro-cid-sckkx6r4>Umbrella Policy</a>
|
||||
<br data-astro-cid-sckkx6r4>
|
||||
<br data-astro-cid-sckkx6r4>
|
||||
<!-- <webversion style="color: #ffffff; text-decoration: underline; font-weight: bold;">View as a Web Page</webversion>
|
||||
<br><br> -->
|
||||
<p style="color: gray" data-astro-cid-sckkx6r4>(C) SudoVanilla 2014 - 2025</p>
|
||||
<br data-astro-cid-sckkx6r4><br data-astro-cid-sckkx6r4>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- Email Footer : END -->
|
||||
|
||||
<!--[if mso]>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<![endif]-->
|
||||
</a></div><a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>
|
||||
|
||||
<!--[if mso | IE]>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<![endif]-->
|
||||
</a></center><a style="margin: 32px auto; display: flex;" href="##URL##" data-astro-cid-sckkx6r4>
|
||||
</a></body></html>
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="h-full">
|
||||
<head>
|
||||
<title>Aptabase</title>
|
||||
<title>Zalvena</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Open Source, Privacy-First and Simple Analytics for Mobile, Desktop and Web apps."
|
||||
|
@ -14,9 +14,8 @@
|
|||
property="og:description"
|
||||
content="Open Source, Privacy-First and Simple Analytics for Mobile, Desktop and Web apps."
|
||||
/>
|
||||
<meta property="og:image" content="https://aptabase.com/og.png" />
|
||||
<meta property="og:image" content="https://md.sudovanilla.org/images/icons/Aptabase.jpg" />
|
||||
|
||||
<meta name="twitter:site" content="@aptabase" />
|
||||
<meta name="twitter:title" content="Open-Source Analytics for Apps" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
import { init } from "@aptabase/web";
|
||||
import { isDevelopment, region } from "./features/env";
|
||||
|
||||
const devAppKey = "A-DEV-0000000000";
|
||||
const appKeys: { [host: string]: string } = {
|
||||
us: "A-US-9580647299",
|
||||
eu: "A-EU-2458276968",
|
||||
};
|
||||
|
||||
const appKey = region ? appKeys[region] : isDevelopment ? devAppKey : undefined;
|
||||
|
||||
export function initAnalytics() {
|
||||
if (!appKey) return;
|
||||
|
||||
init(appKey, {
|
||||
appVersion: import.meta.env.APP_VERSION,
|
||||
isDebug: isDevelopment,
|
||||
});
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
import { region } from "@features/env";
|
||||
import React from "react";
|
||||
|
||||
const flags: { [host: string]: string } = {
|
||||
Mars: new URL('./icons/mars.svg', import.meta.url).href,
|
||||
us: new URL(`./icons/us.svg`, import.meta.url).href,
|
||||
eu: new URL(`./icons/eu.svg`, import.meta.url).href,
|
||||
};
|
||||
|
|
164
src/webapp/components/icons/mars.svg
Normal file
164
src/webapp/components/icons/mars.svg
Normal file
|
@ -0,0 +1,164 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 480 480" xml:space="preserve">
|
||||
<g>
|
||||
<path style="fill:#FF4F19;" d="M24.746,346.221c-0.636-1.286-1.262-2.579-1.876-3.878C23.483,343.643,24.11,344.935,24.746,346.221
|
||||
z"/>
|
||||
<path style="fill:#FF4F19;" d="M22.327,341.18c-0.588-1.263-1.168-2.53-1.735-3.804C21.158,338.651,21.739,339.917,22.327,341.18z"
|
||||
/>
|
||||
<path style="fill:#FF4F19;" d="M20.031,336.094c-0.549-1.254-1.093-2.512-1.621-3.777
|
||||
C18.938,333.582,19.482,334.839,20.031,336.094z"/>
|
||||
<path style="fill:#FF4F19;" d="M17.864,330.98c-0.519-1.265-1.035-2.533-1.533-3.809C16.829,328.448,17.345,329.715,17.864,330.98z
|
||||
"/>
|
||||
<path style="fill:#FF4F19;" d="M303.561,8.525c38.557,10.583,73.23,30.554,101.437,57.281C395.485,64.659,385.822,64,376,64
|
||||
c-124.27,0-226.479,94.448-238.762,215.477h0c-0.003,0.032-0.006,0.065-0.009,0.097c-0.001,0.014-0.002,0.028-0.004,0.042
|
||||
C168.915,285.105,204.253,288,240,288c41.859,0,82.789-3.922,118.367-11.344c14.039-2.938,27.203-6.406,39.141-10.328
|
||||
c4.195-1.391,8.711,0.906,10.094,5.109c1.375,4.195-0.906,8.711-5.109,10.094c-7.778,2.554-16.087,4.897-24.746,7.059
|
||||
c-0.101,0.083-0.148,0.205-0.254,0.285l-15.656,11.742l16.289,4.492c3.508,0.969,5.922,4.172,5.875,7.805
|
||||
c-0.047,3.641-2.531,6.789-6.063,7.664C337.57,330.672,289.867,336,240,336c-3.523,0-6.633-2.305-7.656-5.68
|
||||
s0.289-7.023,3.219-8.977c2.563-1.711,2.469-4.25,2.313-5.258c-0.156-1.016-0.844-3.469-3.813-4.313l-43.789-9.68
|
||||
c-0.065-0.015-0.112-0.062-0.177-0.078c-18.638-1.396-36.801-3.486-53.936-6.363c-0.095,2.772-0.16,5.552-0.16,8.348
|
||||
c0,54.205,18.011,104.173,48.33,144.339c18.574-8.458,37.683-17.042,56.006-16.331c28.82,1.266,43.547-6.867,43.688-6.953
|
||||
c3.828-2.133,8.711-0.82,10.891,2.984c2.18,3.813,0.914,8.656-2.883,10.867c-0.734,0.438-18.305,10.547-52.367,9.086
|
||||
c-13.441-0.686-29.28,6.086-44.936,13.195c0,0,0.001,0.001,0.002,0.002c-0.001,0.001-0.002,0.001-0.004,0.002
|
||||
c5.148,5.928,10.579,11.605,16.276,17.003c-12.859-1.55-25.402-4.12-37.553-7.619c-0.001,0-0.003,0.001-0.004,0.002
|
||||
c-0.035-0.01-0.07-0.022-0.105-0.032c-2.008-0.579-4.005-1.186-5.992-1.816c-1.236-0.389-2.461-0.801-3.688-1.208
|
||||
c-0.474-0.159-0.949-0.314-1.421-0.475c-5.38-1.822-10.685-3.803-15.878-6.005c0.055,0.002,0.115-0.003,0.171-0.002
|
||||
c-49.475-20.934-90.472-57.971-116.398-104.552C71.109,430.151,149.727,480,240,480c132.548,0,240-107.452,240-240
|
||||
C480,129.458,405.259,36.388,303.561,8.525z M272,232c-0.258,0.016-0.68-0.008-1.023-0.008c-11.43,0-18.469,3.594-26.594,7.742
|
||||
c-8.633,4.406-18.18,9.281-32.875,9.281c-3.891,0-8.133-0.344-12.82-1.125c-4.359-0.727-7.305-4.852-6.578-9.203
|
||||
c0.719-4.359,4.828-7.352,9.203-6.578c17.211,2.852,25.813-1.531,35.797-6.625c8.938-4.57,18.742-9.945,35.023-9.484
|
||||
c4.414,0.07,7.938,3.711,7.867,8.133C279.93,228.5,276.359,232,272,232z M334.289,220.945c-7.18,9.141-24.672,10.766-29.859,11.047
|
||||
C304.281,232,304.141,232,303.992,232c-4.219,0-7.742-3.297-7.977-7.563c-0.242-4.406,3.133-8.18,7.539-8.422
|
||||
c7.672-0.438,16.492-2.844,18.156-4.961c2.727-3.469,7.75-4.086,11.234-1.344C336.414,212.437,337.023,217.469,334.289,220.945z
|
||||
M205.68,333.601c-1.523,1.516-3.602,2.398-5.68,2.398s-4.164-0.883-5.68-2.32c-1.445-1.523-2.32-3.602-2.32-5.68
|
||||
s0.875-4.164,2.32-5.68c2.961-2.961,8.32-2.961,11.359,0c1.516,1.516,2.32,3.602,2.32,5.68S207.195,332.156,205.68,333.601z
|
||||
M309.679,373.601c-1.523,1.516-3.602,2.398-5.68,2.398c-2.078,0-4.164-0.883-5.68-2.32c-1.445-1.523-2.32-3.602-2.32-5.68
|
||||
s0.875-4.164,2.32-5.68c2.961-2.961,8.32-2.961,11.359,0c1.516,1.516,2.32,3.602,2.32,5.68S311.195,372.156,309.679,373.601z
|
||||
M373.679,197.502c-1.523,1.516-3.602,2.398-5.68,2.398s-4.164-0.883-5.68-2.32c-1.445-1.523-2.32-3.602-2.32-5.68
|
||||
s0.875-4.164,2.32-5.68c2.961-2.961,8.32-2.961,11.359,0c1.516,1.516,2.32,3.602,2.32,5.68S375.195,196.057,373.679,197.502z
|
||||
M405.679,229.601c-1.523,1.516-3.602,2.398-5.68,2.398s-4.164-0.883-5.68-2.32c-1.445-1.523-2.32-3.602-2.32-5.68
|
||||
s0.875-4.164,2.32-5.68c2.961-2.961,8.32-2.961,11.359,0c1.516,1.516,2.32,3.602,2.32,5.68S407.195,228.156,405.679,229.601z
|
||||
M369.773,130.531c-0.602,0.141-1.195,0.203-1.789,0.203c-3.648,0-6.945-2.508-7.789-6.219c-0.984-4.305,1.703-8.594,6.016-9.578
|
||||
c24.808-5.672,46.328-12.667,64.396-20.713c3.315,4.328,6.492,8.763,9.511,13.315C420.515,116.577,396.919,124.331,369.773,130.531
|
||||
z"/>
|
||||
<path style="fill:#FF4F19;" d="M27.283,351.207c-0.696-1.327-1.378-2.663-2.05-4.004C25.905,348.545,26.588,349.88,27.283,351.207z
|
||||
"/>
|
||||
<path style="fill:#FF4F19;" d="M29.933,356.127c-0.771-1.391-1.525-2.791-2.269-4.198
|
||||
C28.407,353.336,29.163,354.736,29.933,356.127z"/>
|
||||
<path style="fill:#FF4F19;" d="M2.998,277.952c-0.143-0.898-0.281-1.798-0.414-2.7C2.717,276.154,2.855,277.054,2.998,277.952z"/>
|
||||
<path style="fill:#FF4F19;" d="M275.665,2.641c1.355,0.202,2.703,0.423,4.05,0.648C278.367,3.065,277.019,2.843,275.665,2.641z"/>
|
||||
<path style="fill:#FF4F19;" d="M281.394,3.568c1.446,0.252,2.885,0.522,4.322,0.8C284.279,4.091,282.84,3.819,281.394,3.568z"/>
|
||||
<path style="fill:#FF4F19;" d="M0.435,254.289c-0.047-0.793-0.101-1.583-0.14-2.378C0.334,252.706,0.389,253.496,0.435,254.289z"/>
|
||||
<path style="fill:#FF4F19;" d="M0.146,247.974c-0.022-0.667-0.054-1.332-0.07-2.001C0.092,246.641,0.124,247.306,0.146,247.974z"/>
|
||||
<path style="fill:#FF4F19;" d="M269.87,1.849c1.265,0.157,2.523,0.334,3.782,0.511C272.393,2.183,271.135,2.006,269.87,1.849z"/>
|
||||
<path style="fill:#FF4F19;" d="M246.08,0.077c0.765,0.019,1.525,0.058,2.288,0.084C247.605,0.135,246.845,0.096,246.08,0.077z"/>
|
||||
<path style="fill:#FF4F19;" d="M252.11,0.303c0.956,0.048,1.907,0.116,2.86,0.175C254.017,0.42,253.067,0.351,252.11,0.303z"/>
|
||||
<path style="fill:#FF4F19;" d="M287.051,4.623c1.539,0.306,3.071,0.631,4.599,0.967C290.121,5.255,288.589,4.929,287.051,4.623z"/>
|
||||
<path style="fill:#FF4F19;" d="M292.635,5.805c1.633,0.366,3.259,0.75,4.879,1.149C295.894,6.556,294.269,6.17,292.635,5.805z"/>
|
||||
<path style="fill:#FF4F19;" d="M298.142,7.107c1.735,0.432,3.462,0.883,5.182,1.353C301.604,7.991,299.877,7.539,298.142,7.107z"/>
|
||||
<path style="fill:#FF4F19;" d="M2.149,272.147c-0.119-0.886-0.236-1.772-0.345-2.66C1.914,270.375,2.031,271.261,2.149,272.147z"/>
|
||||
<path style="fill:#FF4F19;" d="M1.438,266.279c-0.095-0.869-0.191-1.737-0.276-2.609C1.247,264.542,1.343,265.41,1.438,266.279z"/>
|
||||
<path style="fill:#FF4F19;" d="M0.866,260.34c-0.071-0.843-0.146-1.684-0.208-2.529C0.72,258.656,0.796,259.498,0.866,260.34z"/>
|
||||
<path style="fill:#FF4F19;" d="M258.089,0.676c1.073,0.08,2.141,0.181,3.21,0.276C260.23,0.857,259.162,0.756,258.089,0.676z"/>
|
||||
<path style="fill:#FF4F19;" d="M7.731,300.627c-0.249-0.956-0.482-1.918-0.72-2.879C7.249,298.709,7.482,299.671,7.731,300.627z"/>
|
||||
<path style="fill:#FF4F19;" d="M15.854,325.916c-0.506-1.318-1.009-2.638-1.492-3.967
|
||||
C14.845,323.278,15.348,324.597,15.854,325.916z"/>
|
||||
<path style="fill:#FF4F19;" d="M9.241,306.163c-0.29-1.011-0.56-2.031-0.837-3.047C8.681,304.133,8.952,305.152,9.241,306.163z"/>
|
||||
<path style="fill:#FF4F19;" d="M6.349,295.035c-0.219-0.931-0.424-1.867-0.632-2.802C5.925,293.168,6.131,294.104,6.349,295.035z"
|
||||
/>
|
||||
<path style="fill:#FF4F19;" d="M14.108,321.229c-1.555-4.322-2.983-8.703-4.293-13.136
|
||||
C11.125,312.525,12.554,316.907,14.108,321.229z"/>
|
||||
<path style="fill:#FF4F19;" d="M5.1,289.396c-0.192-0.919-0.375-1.842-0.557-2.764C4.725,287.555,4.907,288.477,5.1,289.396z"/>
|
||||
<path style="fill:#FF4F19;" d="M3.981,283.7c-0.167-0.907-0.327-1.817-0.483-2.728C3.655,281.883,3.815,282.792,3.981,283.7z"/>
|
||||
<path style="fill:#FF4F19;" d="M264.01,1.192c1.172,0.117,2.338,0.254,3.506,0.387C266.348,1.446,265.182,1.309,264.01,1.192z"/>
|
||||
<path style="fill:#DB3F3D;" d="M146.532,461.038c-0.055-0.001-0.116,0.004-0.171,0.002c5.193,2.203,10.499,4.183,15.878,6.005
|
||||
c0.472,0.162,0.948,0.317,1.421,0.475c1.227,0.407,2.452,0.819,3.688,1.208c1.986,0.63,3.983,1.236,5.992,1.816
|
||||
c0.035,0.01,0.07,0.022,0.105,0.032c0.001,0,0.003-0.001,0.004-0.002c12.15,3.499,24.694,6.069,37.553,7.619
|
||||
c-5.697-5.398-11.128-11.075-16.276-17.003c-1.46,0.663-2.921,1.326-4.375,1.989c-5.725,2.606-11.35,5.158-16.817,7.36
|
||||
c-0.763-0.219-1.527-0.437-2.288-0.663c-2.699-0.804-5.369-1.67-8.03-2.559c-1.713-0.578-3.439-1.131-5.135-1.747
|
||||
c-1.86-0.668-3.681-1.418-5.519-2.133c-2.014-0.789-4.034-1.565-6.021-2.406c9.272,0.228,23.412-6.149,37.177-12.414
|
||||
c0.22-0.1,0.441-0.2,0.662-0.3c3.32,4.398,6.74,8.715,10.348,12.87c15.656-7.109,31.495-13.881,44.936-13.195
|
||||
c34.063,1.461,51.633-8.648,52.367-9.086c3.797-2.211,5.063-7.055,2.883-10.867c-2.18-3.805-7.063-5.117-10.891-2.984
|
||||
c-0.141,0.086-14.867,8.219-43.688,6.953c-18.323-0.711-37.432,7.873-56.006,16.331C154.011,408.173,136,358.205,136,304
|
||||
c0-2.796,0.065-5.575,0.16-8.348c17.136,2.878,35.298,4.968,53.936,6.363c0.065,0.016,0.111,0.063,0.177,0.078l43.789,9.68
|
||||
c2.969,0.844,3.656,3.297,3.813,4.313c0.156,1.008,0.25,3.547-2.313,5.258c-2.93,1.953-4.242,5.602-3.219,8.977
|
||||
S236.476,336,240,336c49.867,0,97.57-5.328,137.937-15.422c3.531-0.875,6.016-4.023,6.063-7.664
|
||||
c0.047-3.633-2.367-6.836-5.875-7.805l-16.289-4.492l15.656-11.742c0.106-0.08,0.153-0.201,0.254-0.285
|
||||
c8.658-2.162,16.968-4.505,24.746-7.059c4.203-1.383,6.484-5.898,5.109-10.094c-1.383-4.203-5.898-6.5-10.094-5.109
|
||||
c-11.938,3.922-25.102,7.391-39.141,10.328C322.789,284.078,281.859,288,240,288c-35.747,0-71.085-2.895-102.775-8.384
|
||||
c0.001-0.014,0.002-0.028,0.004-0.042c-0.534,5.292-0.831,10.651-1.017,16.039c-3.252-0.546-6.532-1.072-9.705-1.676
|
||||
c-4.344-0.828-7.195-5.016-6.367-9.352c0.82-4.344,5.008-7.188,9.352-6.367c2.503,0.477,5.193,0.816,7.745,1.259
|
||||
C149.521,158.448,251.73,64,376,64c9.822,0,19.485,0.659,28.998,1.806C376.79,39.079,342.118,19.108,303.561,8.525
|
||||
c-0.079-0.022-0.158-0.043-0.237-0.064c-1.719-0.47-3.447-0.921-5.182-1.353c-0.208-0.052-0.418-0.102-0.627-0.153
|
||||
c-1.62-0.399-3.246-0.783-4.879-1.149c-0.328-0.074-0.658-0.143-0.986-0.215c-1.528-0.336-3.06-0.66-4.599-0.967
|
||||
c-0.444-0.088-0.89-0.17-1.334-0.256c-1.437-0.278-2.876-0.548-4.322-0.8c-0.558-0.097-1.12-0.185-1.679-0.278
|
||||
c-1.347-0.225-2.696-0.446-4.05-0.648c-0.669-0.1-1.342-0.187-2.013-0.282c-1.259-0.177-2.517-0.354-3.782-0.511
|
||||
c-0.782-0.097-1.57-0.179-2.354-0.269c-1.167-0.134-2.333-0.271-3.506-0.387c-0.901-0.09-1.807-0.161-2.71-0.241
|
||||
c-1.069-0.094-2.137-0.195-3.21-0.276c-1.036-0.077-2.079-0.134-3.119-0.198c-0.953-0.059-1.904-0.128-2.86-0.175
|
||||
c-1.244-0.062-2.494-0.099-3.743-0.142c-0.763-0.026-1.523-0.065-2.288-0.084C244.059,0.027,242.033,0,240,0
|
||||
C134.986,0,45.739,67.453,13.186,161.39c0.463-1.356,0.939-2.706,1.431-4.048c0.176,0.157,0.398,0.225,0.563,0.4
|
||||
c12.797,13.672,36.086,26.328,67.344,36.594c4.203,1.383,6.484,5.898,5.109,10.094c-1.109,3.375-4.234,5.508-7.602,5.508
|
||||
c-0.828,0-1.664-0.125-2.492-0.398c-29.783-9.778-53.172-21.912-68.33-35.342c1.216-4.272,2.51-8.51,3.935-12.688
|
||||
C4.635,186.105,0,212.51,0,240c0,1.997,0.027,3.987,0.076,5.973c0.016,0.669,0.049,1.334,0.07,2.001
|
||||
c0.043,1.314,0.086,2.628,0.15,3.937c0.039,0.795,0.093,1.585,0.14,2.378c0.069,1.176,0.137,2.351,0.223,3.522
|
||||
c0.062,0.845,0.137,1.686,0.208,2.529c0.094,1.112,0.187,2.223,0.296,3.33c0.085,0.872,0.181,1.74,0.276,2.609
|
||||
c0.117,1.071,0.236,2.141,0.367,3.208c0.109,0.889,0.226,1.775,0.345,2.66c0.139,1.037,0.282,2.072,0.434,3.105
|
||||
c0.133,0.902,0.271,1.802,0.414,2.7c0.16,1.009,0.327,2.015,0.5,3.02c0.157,0.911,0.316,1.821,0.483,2.728
|
||||
c0.18,0.98,0.37,1.956,0.562,2.932c0.182,0.923,0.364,1.845,0.557,2.764c0.198,0.948,0.408,1.893,0.618,2.837
|
||||
c0.208,0.935,0.413,1.871,0.632,2.802c0.213,0.907,0.439,1.81,0.662,2.713c0.237,0.961,0.471,1.923,0.72,2.879
|
||||
c0.217,0.833,0.448,1.66,0.674,2.489c0.277,1.017,0.547,2.036,0.837,3.047c0.185,0.646,0.384,1.286,0.574,1.929
|
||||
c1.31,4.433,2.738,8.815,4.293,13.136c0.086,0.239,0.167,0.481,0.254,0.72c0.483,1.329,0.986,2.649,1.492,3.967
|
||||
c0.16,0.418,0.315,0.839,0.477,1.255c0.498,1.276,1.014,2.544,1.533,3.809c0.183,0.445,0.361,0.892,0.546,1.336
|
||||
c0.528,1.266,1.072,2.523,1.621,3.777c0.187,0.427,0.371,0.856,0.561,1.283c0.567,1.274,1.147,2.541,1.735,3.804
|
||||
c0.181,0.388,0.36,0.776,0.543,1.163c0.614,1.299,1.24,2.592,1.876,3.878c0.162,0.327,0.324,0.655,0.488,0.981
|
||||
c0.671,1.342,1.354,2.677,2.05,4.004c0.126,0.241,0.254,0.481,0.381,0.722c0.744,1.407,1.499,2.808,2.269,4.198
|
||||
c0.067,0.12,0.134,0.239,0.201,0.359C56.061,403.068,97.058,440.104,146.532,461.038z M170.32,74.32
|
||||
c2.961-2.961,8.32-2.961,11.359,0c1.516,1.516,2.32,3.602,2.32,5.68s-0.805,4.156-2.32,5.602C180.156,87.117,178.078,88,176,88
|
||||
s-4.164-0.883-5.68-2.32C168.875,84.156,168,82.078,168,80S168.875,75.836,170.32,74.32z M104.835,106.028
|
||||
c6.196-9.737,17.263-13.784,24.718-9.04c7.455,4.744,8.476,16.483,2.28,26.22s-17.262,13.784-24.718,9.04
|
||||
S98.639,115.765,104.835,106.028z M55.635,274.818c-1.982-9.17,2.103-17.834,9.124-19.352c7.021-1.518,14.32,4.686,16.302,13.856
|
||||
s-2.103,17.834-9.124,19.352C64.916,290.191,57.617,283.987,55.635,274.818z"/>
|
||||
<path style="fill:#DB3F3D;" d="M272.133,216c-16.281-0.461-26.086,4.914-35.023,9.484c-9.984,5.094-18.586,9.477-35.797,6.625
|
||||
c-4.375-0.773-8.484,2.219-9.203,6.578c-0.727,4.352,2.219,8.477,6.578,9.203c4.688,0.781,8.93,1.125,12.82,1.125
|
||||
c14.695,0,24.242-4.875,32.875-9.281c8.125-4.148,15.164-7.742,26.594-7.742c0.344,0,0.766,0.023,1.023,0.008
|
||||
c4.359,0,7.93-3.5,8-7.867C280.07,219.711,276.547,216.07,272.133,216z"/>
|
||||
<path style="fill:#DB3F3D;" d="M332.945,209.711c-3.484-2.742-8.508-2.125-11.234,1.344c-1.664,2.117-10.484,4.523-18.156,4.961
|
||||
c-4.406,0.242-7.781,4.016-7.539,8.422c0.234,4.266,3.758,7.563,7.977,7.563c0.148,0,0.289,0,0.438-0.008
|
||||
c5.187-0.281,22.68-1.906,29.859-11.047C337.023,217.469,336.414,212.437,332.945,209.711z"/>
|
||||
|
||||
<ellipse transform="matrix(-0.5369 0.8437 -0.8437 -0.5369 278.5632 76.3195)" style="fill:#A03939;" cx="118.334" cy="114.618" rx="20.897" ry="16"/>
|
||||
|
||||
<ellipse transform="matrix(0.9774 -0.2113 0.2113 0.9774 -55.9416 20.5831)" style="fill:#A03939;" cx="68.348" cy="272.069" rx="13.006" ry="16.987"/>
|
||||
<path style="fill:#A03939;" d="M176,88c2.078,0,4.156-0.883,5.68-2.398C183.195,84.156,184,82.078,184,80s-0.805-4.164-2.32-5.68
|
||||
c-3.039-2.961-8.398-2.961-11.359,0C168.875,75.836,168,77.922,168,80s0.875,4.156,2.32,5.68C171.836,87.117,173.922,88,176,88z"/>
|
||||
<path style="fill:#DB3F3D;" d="M362.32,186.221c-1.445,1.516-2.32,3.602-2.32,5.68s0.875,4.156,2.32,5.68
|
||||
c1.516,1.438,3.602,2.32,5.68,2.32s4.156-0.883,5.68-2.398c1.516-1.445,2.32-3.523,2.32-5.602s-0.805-4.164-2.32-5.68
|
||||
C370.64,183.26,365.281,183.26,362.32,186.221z"/>
|
||||
<path style="fill:#DB3F3D;" d="M394.32,218.32c-1.445,1.516-2.32,3.602-2.32,5.68s0.875,4.156,2.32,5.68
|
||||
c1.516,1.438,3.602,2.32,5.68,2.32s4.156-0.883,5.68-2.398c1.516-1.445,2.32-3.523,2.32-5.602s-0.805-4.164-2.32-5.68
|
||||
C402.64,215.359,397.281,215.359,394.32,218.32z"/>
|
||||
<path style="fill:#DB3F3D;" d="M194.32,322.32c-1.445,1.516-2.32,3.602-2.32,5.68s0.875,4.156,2.32,5.68
|
||||
c1.516,1.438,3.602,2.32,5.68,2.32s4.156-0.883,5.68-2.398c1.516-1.445,2.32-3.523,2.32-5.602s-0.805-4.164-2.32-5.68
|
||||
C202.641,319.359,197.281,319.359,194.32,322.32z"/>
|
||||
<path style="fill:#DB3F3D;" d="M298.32,362.32c-1.445,1.516-2.32,3.602-2.32,5.68s0.875,4.156,2.32,5.68
|
||||
c1.516,1.438,3.602,2.32,5.68,2.32c2.078,0,4.156-0.883,5.68-2.398c1.516-1.445,2.32-3.523,2.32-5.602s-0.805-4.164-2.32-5.68
|
||||
C306.64,359.359,301.281,359.359,298.32,362.32z"/>
|
||||
<path style="fill:#A03939;" d="M120.141,284.586c-0.828,4.336,2.023,8.523,6.367,9.352c3.173,0.604,6.453,1.13,9.705,1.676
|
||||
c0.185-5.388,0.482-10.747,1.017-16.039c0.003-0.032,0.005-0.065,0.009-0.097h0c-2.552-0.443-5.243-0.782-7.745-1.259
|
||||
C125.148,277.398,120.961,280.242,120.141,284.586z"/>
|
||||
<path style="fill:#A03939;" d="M77.539,209.539c0.828,0.273,1.664,0.398,2.492,0.398c3.367,0,6.492-2.133,7.602-5.508
|
||||
c1.375-4.195-0.906-8.711-5.109-10.094c-31.258-10.266-54.547-22.922-67.344-36.594c-0.164-0.175-0.387-0.243-0.563-0.4
|
||||
c-0.492,1.342-0.968,2.692-1.431,4.048c-0.014,0.04-0.028,0.079-0.042,0.119c-1.425,4.178-2.719,8.417-3.935,12.688
|
||||
C24.367,187.627,47.756,199.761,77.539,209.539z"/>
|
||||
<path style="fill:#A03939;" d="M184.38,448.317c-0.22,0.1-0.442,0.2-0.662,0.3c-13.765,6.265-27.904,12.642-37.177,12.414
|
||||
c1.987,0.841,4.007,1.618,6.021,2.406c1.838,0.714,3.659,1.464,5.519,2.133c1.696,0.616,3.421,1.169,5.135,1.747
|
||||
c2.661,0.889,5.331,1.755,8.03,2.559c0.76,0.227,1.524,0.444,2.288,0.663c5.467-2.202,11.092-4.754,16.817-7.36
|
||||
c1.454-0.663,2.915-1.326,4.375-1.989c0.001-0.001,0.002-0.001,0.004-0.002c-0.001-0.001-0.001-0.001-0.001-0.001
|
||||
C191.121,457.032,187.7,452.715,184.38,448.317z"/>
|
||||
<path style="fill:#DB3F3D;" d="M430.607,94.224c-18.068,8.047-39.588,15.041-64.396,20.713c-4.313,0.984-7,5.273-6.016,9.578
|
||||
c0.844,3.711,4.141,6.219,7.789,6.219c0.594,0,1.188-0.063,1.789-0.203c27.146-6.2,50.742-13.954,70.345-22.992
|
||||
C437.098,102.987,433.922,98.552,430.607,94.224z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
|
@ -1,4 +1,3 @@
|
|||
import { trackEvent } from "@aptabase/web";
|
||||
import { LazyLoad } from "@components/LazyLoad";
|
||||
import { Page, PageHeading } from "@components/Page";
|
||||
import { useApps } from "@features/apps";
|
||||
|
@ -21,12 +20,6 @@ export function Component() {
|
|||
if (!startDateIso || !endDateIso) {
|
||||
return;
|
||||
}
|
||||
|
||||
trackEvent("home_viewed", {
|
||||
startDate: startDateIso,
|
||||
endDate: endDateIso,
|
||||
apps_count: apps.length,
|
||||
});
|
||||
}, [startDateIso, endDateIso, apps]);
|
||||
|
||||
if (apps.length === 0) {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import { trackEvent } from "@aptabase/web";
|
||||
import { Button } from "@components/Button";
|
||||
import { Page, PageHeading } from "@components/Page";
|
||||
import { liveSessionDetails } from "@features/analytics/query";
|
||||
|
@ -29,9 +28,7 @@ export function Component() {
|
|||
refetchInterval: 10000,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
trackEvent("liveview_session_viewed");
|
||||
}, []);
|
||||
useEffect(() => {}, []);
|
||||
|
||||
const handleBack = () => {
|
||||
if (location.state?.returnTo) {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import { trackEvent } from "@aptabase/web";
|
||||
import { Page, PageHeading } from "@components/Page";
|
||||
import { PingSignal } from "@components/PingSignal";
|
||||
import { liveGeoDataPoints } from "@features/analytics/query";
|
||||
|
@ -24,9 +23,7 @@ export function Component() {
|
|||
refetchInterval: 10000,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
trackEvent("liveview_viewed", { name: app.name });
|
||||
}, [app.name]);
|
||||
useEffect(() => {}, [app.name]);
|
||||
|
||||
const totalUsers = dataPoints?.reduce((total, point) => total + point.users, 0) ?? 0;
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import { trackEvent } from "@aptabase/web";
|
||||
import { Page, PageHeading } from "@components/Page";
|
||||
import { UserSessionsList } from "@features/analytics/sessions/UsersSessionsList";
|
||||
import { useApps, useCurrentApp } from "@features/apps";
|
||||
|
@ -14,9 +13,7 @@ export function Component() {
|
|||
|
||||
if (!app) return <Navigate to="/" />;
|
||||
|
||||
useEffect(() => {
|
||||
trackEvent("user_sessions_viewed");
|
||||
}, []);
|
||||
useEffect(() => {}, [app.name]);
|
||||
|
||||
return (
|
||||
<Page title="User Sessions">
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue