From 03d7bd8de64df66ca267f88cdd32683363e1e692 Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 29 Mar 2026 23:56:20 +0000 Subject: [PATCH] Delete Account API + UI + Store assets (icon, graphic, screenshot) - DELETE /api/v1/auth/delete-account (GDPR + Google Play req) - Settings: red Delete Account section with confirmation - Store assets: icon-512, feature-graphic, screenshot-1 Co-Authored-By: Claude Opus 4.6 (1M context) --- android/store-assets/feature-graphic.png | Bin 0 -> 16406 bytes android/store-assets/icon-512.png | Bin 0 -> 7356 bytes android/store-assets/screenshot-1.png | Bin 0 -> 16568 bytes api/src/routes/auth.js | 31 +++++++++++ apps/tasks/app/privacy/page.tsx | 66 ++++++++--------------- apps/tasks/app/settings/page.tsx | 15 ++++++ 6 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 android/store-assets/feature-graphic.png create mode 100644 android/store-assets/icon-512.png create mode 100644 android/store-assets/screenshot-1.png diff --git a/android/store-assets/feature-graphic.png b/android/store-assets/feature-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7de5df931d4cb7985a312244e32ea33647d032 GIT binary patch literal 16406 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

>cvNKo0?idT{G)x%4Xm-2Ek_gx-Q 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

uXi zcfG2X1UxK`uLQHGJ-%zl)DX^n78Y62(s!c`ohqS?tiTN>G_-m0H#WOwf`(gkyR|}h zKU~Heep2XRQtj<*dp#J>+SDl1u-}GEj6B9>=BKJmV?*L@9i4YVrOB4&{1w>8kiUGu z@dH!9xh|1ykNbwFU3Kia9{BSc8MY4`HyCYM#YC*^b3`C`ZE#jT)-StyRHf93nt#Y+ zGsniS!y44}3B8TKB-{aJW=iV8HyIGQgrW5UfL}yae0SR`*=r-JHp*k-`XYAW3XKUV z46YNW2*n!de`8&f+(? z20SBY@dwb|>DcLSt#N`J+m5&P9(-=LXH7L` zF(0XM8u27k4g7V!xWU!4PAnjq9S84Fw@8!uyUrM-sX|@NSabIjVk*{8yLC4Db*w(^ zjuNh4n9Ta~Rt#I@-WoakSe3uu0gTq(=@{iM{k5TY{x!` z52j-eiCFplZbqfS&oM>oI^W9zB0}(#R@@Fn-gdY;&^yOUy>ijwawFMZdkBPY3PcL>g+LuHLnz|I@zWV3t4es;BCZK+vsoO^ zUoW+@NS3a9p*umKbiIu>&)>#K;3HYO7^Ae0US(V*DpBPw484oHnYOn;zg%JOnepRZ z)(9WsseNqMly{y^`v1`FY>&;b?32tv+*&_w%)6EZ4Z`>db&<>!=&U`wX-)XOo3Z6S zCl#!f4k{2Ya$`Si@O*~)uz%^2zDe`f`18Z#OmL{dNe-Kd_iJ$*rc>cGUgJwrCA7=F6xR(>DNzAmP%x*r$y zwrmat08opx6l|k2PfaydCm+F|3cls<6Tn}y-$26JmTG9@&uw5S}xNs*dgHhMbN|2%&Obp;wvpcnb~iM)TG xQvCO!OAzSa2T}hm1)zUR!M~;8|9L5pDpPD!2NKFEPHzCNwWZx3l^1T@|38v@KHLBR literal 0 HcmV?d00001 diff --git a/android/store-assets/icon-512.png b/android/store-assets/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..6483e8af00eeacf40ed2fb67716af52da8f820ae GIT binary patch literal 7356 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 V!f8S99|;&V)%9){-2CnN{{a;fWL^LO literal 0 HcmV?d00001 diff --git a/api/src/routes/auth.js b/api/src/routes/auth.js index 93ebafb..4846339 100644 --- a/api/src/routes/auth.js +++ b/api/src/routes/auth.js @@ -101,6 +101,18 @@ async function authRoutes(app) { return { status: 'not_implemented', message: 'WebAuthn biometric auth coming soon.' }; }); + // Delete account + app.delete('/auth/account', { preHandler: [async (req) => { await req.jwtVerify(); }] }, async (req, reply) => { + const uid = req.user.id; + await app.db.query('DELETE FROM task_assignments WHERE user_id=$1 OR assigned_by=$1', [uid]); + await app.db.query('DELETE FROM tasks WHERE user_id=$1', [uid]); + await app.db.query('DELETE FROM task_groups WHERE user_id=$1', [uid]); + await app.db.query('DELETE FROM goals WHERE user_id=$1', [uid]); + await app.db.query('DELETE FROM sessions WHERE user_id=$1', [uid]); + await app.db.query('DELETE FROM users WHERE id=$1', [uid]); + return reply.send({ data: { deleted: true } }); + }); + // OAuth initiate routes moved to ./oauth.js // Search users by name or email (for collaboration) @@ -117,3 +129,22 @@ async function authRoutes(app) { } module.exports = authRoutes; + +// Delete account (GDPR + Google Play requirement) +app.delete("/auth/delete-account", { preHandler: [async (req) => { await req.jwtVerify(); }] }, async (req) => { + const userId = req.user.id; + + // Delete all user data in order (foreign keys) + await app.db.query("DELETE FROM task_comments WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM subtasks WHERE assigned_to = $1", [userId]); + await app.db.query("DELETE FROM task_collaboration WHERE from_user_id = $1 OR to_user_id = $1", [userId]); + await app.db.query("DELETE FROM task_assignments WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM push_subscriptions WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM goals WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM connectors WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM tasks WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM task_groups WHERE user_id = $1", [userId]); + await app.db.query("DELETE FROM users WHERE id = $1", [userId]); + + return { status: "deleted", message: "Account and all data permanently deleted" }; +}); diff --git a/apps/tasks/app/privacy/page.tsx b/apps/tasks/app/privacy/page.tsx index a498d18..d441e1f 100644 --- a/apps/tasks/app/privacy/page.tsx +++ b/apps/tasks/app/privacy/page.tsx @@ -1,54 +1,34 @@ export default function PrivacyPage() { return ( -

-

Privacy Policy

-

Last updated: March 29, 2026

- -

1. Information We Collect

-

Task Team collects the following information when you create an account:

-
    -
  • Email address
  • -
  • Name
  • -
  • Phone number (optional)
  • -
-

We also collect task data, goals, and settings you create within the app.

+
+

Privacy Policy - Task Team

+

Last updated: March 30, 2026

-

2. How We Use Your Data

-

Your data is used exclusively to provide the Task Team service:

-
    -
  • Task management and organization
  • -
  • AI-powered planning assistance
  • -
  • Calendar and goal tracking
  • -
  • Team collaboration features
  • -
  • Push notifications for task reminders
  • -
+

Data We Collect

+

Account info (name, email), task data, GPS location (optional), audio for voice-to-text (optional).

-

3. Data Storage

-

Your data is stored on secure servers in the European Union (Hetzner, Germany). We use PostgreSQL databases with encrypted connections and regular backups.

+

How We Use It

+

Task management, sync across devices, reminders, GPS auto-verify task completion.

-

4. Third-Party Services

-
    -
  • Anthropic Claude AI — for AI chat and planning features (messages are processed but not stored by Anthropic)
  • -
  • Google OAuth — for optional Google login
  • -
  • Expo — for push notifications
  • -
+

Data Storage

+

Your data is stored on secure servers in the European Union (Hetzner Cloud, Germany). We use PostgreSQL databases with encrypted connections and regular backups.

-

5. Data Sharing

-

We do not sell, trade, or share your personal data with third parties. Data is only shared with team members you explicitly invite to collaborate.

+

Data Sharing

+

We do NOT sell data. Services used: Hetzner Cloud Germany, Anthropic Claude AI.

-

6. Your Rights (GDPR)

-

You have the right to:

-
    -
  • Access your data
  • -
  • Export your data
  • -
  • Delete your account and all data
  • -
  • Modify your personal information
  • -
+

Your Rights (GDPR)

+

You have the right to access, correct, and delete your data. Contact: privacy@it-enterprise.cz

-

7. Contact

-

IT Enterprise Solution s.r.o.
Email: apps@it-enterprise.cz
Web: https://it-enterprise.cz

- -

© 2026 IT Enterprise Solution s.r.o. All rights reserved.

+

Permissions

+

Location and microphone are optional, revocable anytime in your device settings.

+ +

Children

+

Not directed to children under 13.

+ +

Contact

+

IT Enterprise s.r.o. | privacy@it-enterprise.cz | tasks.hasdo.info

+ +

© 2026 IT Enterprise s.r.o. All rights reserved.

); } diff --git a/apps/tasks/app/settings/page.tsx b/apps/tasks/app/settings/page.tsx index e784c87..dc0e7f3 100644 --- a/apps/tasks/app/settings/page.tsx +++ b/apps/tasks/app/settings/page.tsx @@ -217,6 +217,21 @@ export default function SettingsPage() {

{t("common.appName")} {t("common.appVersion")}

+ +
+

Smazat ucet

+

Trvale smazat ucet a vsechna data. Tuto akci nelze vratit.

+ +
); }