Compare commits

192 Commits

Author SHA1 Message Date
Torsten Schulz (local)
b0c8f01fde Refactor backend CORS settings to include default origins and improve error handling in chat services: Introduce dynamic CORS origin handling, enhance RabbitMQ message sending with fallback mechanisms, and update WebSocket service to manage pending messages. Update UI components for better accessibility and responsiveness, including adjustments to dialog and navigation elements. Enhance styling for improved user experience across various components. 2026-03-19 14:44:04 +01:00
Torsten Schulz (local)
70ee17a48a Enhance backend configuration and error handling: Update CORS settings to allow dynamic origins, improve RabbitMQ connection handling in chat services, and adjust API server host configuration. Refactor environment variables for better flexibility and add fallback mechanisms for WebSocket and chat services. Update frontend environment files for consistent API and WebSocket URLs. 2026-03-18 22:45:22 +01:00
Torsten Schulz (local)
4fb6ce06d3 Update SEO and meta tags in index.html, enhance robots.txt for better crawling control, and improve sitemap.xml priorities. Refactor blog routes to include SEO metadata and adjust blog view for canonical URLs. Implement blog URL generation in BlogListView and apply SEO dynamically in BlogView. 2026-03-18 22:02:44 +01:00
Torsten Schulz (local)
b6eea313d7 Add Bisaya course content for 'Ort & Richtung' and 'Alltagsgespräche - Teil 2' lessons: Introduce multiple-choice, gap-fill, and transformation exercises focusing on location and everyday conversation vocabulary, complete with translations and explanations. 2026-03-05 13:28:08 +01:00
Torsten Schulz (local)
f5e5918615 Add Bisaya course content for 'Haus & Familie' lesson: Introduce multiple-choice and gap-fill exercises for vocabulary related to house and family terms, including translations and explanations. Update lesson tracking to include the new lesson in the course content. 2026-03-05 13:23:56 +01:00
Torsten Schulz (local)
9800306cf8 Implement password prompt UI and logic in MultiChatDialog: Add a password entry panel with validation and error handling for room access. Update i18n files for localized password prompts in English, German, and Spanish. 2026-03-04 23:34:55 +01:00
Torsten Schulz (local)
e0ae5e2674 Add password protection feature in MultiChatDialog: Implement room password management, including prompts for password entry and error handling for invalid passwords. Update i18n files with localized messages for password prompts in English, German, and Spanish. 2026-03-04 23:32:32 +01:00
Torsten Schulz (local)
4763bd0b64 Enhance room creation tracking in MultiChatDialog: Implement logic to confirm room creation success, manage pending room creation attempts, and clear tracking on dialog close. Update i18n files with new localized messages for room creation status. 2026-03-04 23:28:54 +01:00
Torsten Schulz (local)
1e5dcfb836 Add functionality for managing user-owned chat rooms: Implement getOwnRooms and deleteOwnRoom methods in ChatController and ChatService, add corresponding API routes in chatRouter, and enhance MultiChatDialog for displaying and deleting owned rooms with localized messages. Update i18n files for new features. 2026-03-04 23:22:16 +01:00
Torsten Schulz (local)
1f4130a940 Add room creation options endpoint and integrate with chat UI: Implement getRoomCreateOptions in ChatController and ChatService, add corresponding API route, and enhance MultiChatDialog for room creation with localized labels and validation. Update i18n files for new room creation features. 2026-03-04 23:12:54 +01:00
Torsten Schulz (local)
ec077e3d3c Remove publicFlag from room creation form in MultiChatDialog: Simplify visibility handling by directly using the visibility state to determine public/private status, enhancing clarity and reducing redundancy. 2026-03-04 22:59:08 +01:00
Torsten Schulz (local)
bc8dce82f8 Refactor getRaceLimit method in MultiChatDialog: Simplify logic by returning a fixed value of 1, ensuring consistent race limit handling. 2026-03-04 22:53:39 +01:00
Torsten Schulz (local)
5755f2deaa Update WebSocket connection handling in MultiChatDialog: Change raceLimit to 1 to prevent duplicate daemon sockets and ensure only one connection attempt in parallel. 2026-03-04 22:50:54 +01:00
Torsten Schulz (local)
ab340f3447 Add validation and error handling for room creation form in MultiChatDialog: Implement input validation for room name, age restrictions, password, and access rights. Enhance UI with error messages and disable button when validation fails. 2026-03-04 22:44:15 +01:00
Torsten Schulz (local)
282a994093 Implement room creation panel in MultiChatDialog: Add functionality for users to create new chat rooms with customizable settings, including visibility, age restrictions, and password protection. Enhance UI with a toggle button and form for room details. 2026-03-04 22:42:48 +01:00
Torsten Schulz (local)
a3cb3ca70c Update room management in AdminController: Modify updateRoom and deleteRoom methods to include userId as a parameter for improved access control. 2026-03-04 22:38:24 +01:00
Torsten Schulz (local)
af8f3aca64 Update chat configuration and remove MultiChat component: Change chat port to 1236 in chatBridge.json, update WebSocket URL in .env.local, and delete the MultiChat.vue component to streamline chat functionality. 2026-03-04 17:24:15 +01:00
Torsten Schulz (local)
bdce991d4d Füge neue Funktionen zur Verwaltung von Erben hinzu: Implementiere die API-Endpunkte zum Abrufen potenzieller Erben und zum Auswählen eines Erben. Ergänze die Logik in FalukantService zur Verarbeitung dieser Funktionen. 2026-03-02 00:36:43 +01:00
Torsten Schulz (local)
a90fe67c2c Verbessere die Behandlung von Charaktereigenschaften beim Versenden von Geschenken: Füge eine Überprüfung hinzu, um sicherzustellen, dass characterTraits ein Array ist, und behandle fehlende Traits als neutralen Wert. 2026-02-14 16:48:23 +01:00
Torsten Schulz (local)
f5e767c23a Verbessere die Sicherheitsüberprüfung der Benutzermerkmale in der Geschenksuche: Füge eine sichere Trait-Filterung hinzu, um Fehler bei undefinierten Eigenschaften zu vermeiden. 2026-02-14 16:44:51 +01:00
Torsten Schulz (local)
bd44b66faa Normalisiere eingehende API-Daten: Akzeptiere sowohl camelCase als auch snake_case für die Eigenschaften des Falukant-Datenobjekts. 2026-02-14 16:41:14 +01:00
Torsten Schulz (local)
3c3606ade1 Passe die Schlüssel in den Arrays für Stimmungen und Charaktere an snake_case an 2026-02-14 16:38:57 +01:00
Torsten Schulz (local)
6b06205054 Verbessere die Handhabung des Ladens von .env-Dateien: Füge Lesbarkeitsprüfung für Produktions-.env hinzu und verbessere Fehlerbehandlung beim Laden. 2026-02-14 16:22:22 +01:00
Torsten Schulz (local)
f2ec41103f Füge Validierung für Geschenke in FalukantService hinzu und erstelle Skripte zur Reparatur ungültiger Werte in PromotionalGift 2026-02-14 16:19:31 +01:00
Torsten Schulz (local)
10962945bd Verbessere die Berechnung der Geschenkekosten in FalukantService und füge Tests für die Funktion hinzu 2026-02-14 16:12:07 +01:00
Torsten Schulz (local)
78e96d953d Korrigiere Zuweisung von Beziehungen und verbessere Trait-IDs-Verarbeitung in FalukantService 2026-02-14 15:58:01 +01:00
Torsten Schulz (local)
332946261b Entferne Debug-Logs für Alters- und Geschlechtsbezeichnungen in FalukantWidget 2026-02-09 17:29:10 +01:00
Torsten Schulz (local)
06e614f0c0 Verbessere die Handhabung von Altersgruppen in FalukantWidget: Lese Rohwerte direkt aus i18n-Nachrichten, um Plural/Choice-Format zu vermeiden. 2026-02-09 17:26:36 +01:00
Torsten Schulz (local)
8f35f749cc Füge Debug-Logs für Alters- und Geschlechtsbezeichnungen in FalukantWidget hinzu 2026-02-09 17:18:44 +01:00
Torsten Schulz (local)
fd7c85269d Füge Altersgruppenübersetzungen in genderAge hinzu: Ergänze männliche, weibliche und neutrale Bezeichnungen für verschiedene Altersgruppen. 2026-02-09 17:12:49 +01:00
Torsten Schulz (local)
0621889a2e Korrigiere Altersgruppenlogik in FalukantWidget: Überarbeite die Altersberechnung und passe die Kommentare für Klarheit an. 2026-02-09 17:06:30 +01:00
Torsten Schulz (local)
7641f9b953 Aktualisiere die Altersberechnung in FalukantWidget: Ändere die Umrechnung von Tagen in Jahre und runde auf das nächste Jahr für eine erwartbare Anzeige. 2026-02-09 17:02:41 +01:00
Torsten Schulz (local)
0f65cd86b5 Refactor code structure for improved readability and maintainability 2026-02-09 16:50:25 +01:00
Torsten Schulz (local)
a0b7bb1c04 Revert "Refactor DirectorInfo and SaleSection components to unify speedLabel logic and remove unnecessary watch properties"
This reverts commit ba4e85a60b.
2026-02-09 15:56:48 +01:00
Torsten Schulz (local)
6f49ff87ac Add Spanish locale files and initial translations 2026-02-09 15:55:04 +01:00
Torsten Schulz (local)
1d2c6d1563 Update gender age labels in locale files: Adjusted age group definitions and refined translations for gender terms in both German and English locale files. 2026-02-09 15:21:41 +01:00
Torsten Schulz (local)
da275061bf Implement age-based gender labels in FalukantWidget and update translations: Added logic to determine gender labels based on age groups and updated locale files for German and English. 2026-02-09 15:16:51 +01:00
Torsten Schulz (local)
c351bad45a Enhance FalukantWidget gender label logic and add age-based labels: Updated gender label computation to include age-based distinctions for children and adults. Added new translation key for "years" in both German and English locale files. 2026-02-09 15:12:23 +01:00
Torsten Schulz (local)
0aef039283 Add dashboard widget endpoint: Implemented getDashboardWidget method in FalukantService and updated router to provide compact user data for the dashboard widget, ensuring frontend compatibility. 2026-02-09 15:05:17 +01:00
Torsten Schulz (local)
420591d376 Add legacy endpoint for dashboard widget: Implemented /dashboard-widget route to provide data expected by the Dashboard-Falukant widget, ensuring compatibility with frontend requirements. 2026-02-09 13:00:59 +01:00
Torsten Schulz (local)
37250f546e Add error handling for nobility advancement in NobilityView: Implemented specific error messages for cooldown and unmet requirements, enhancing user feedback during advancement attempts. 2026-02-09 12:03:59 +01:00
Torsten Schulz (local)
ba4e85a60b Refactor DirectorInfo and SaleSection components to unify speedLabel logic and remove unnecessary watch properties
- Simplified speedLabel method in DirectorInfo.vue and SaleSection.vue to handle null values and translations more efficiently.
- Removed the watch property for branchId in DirectorInfo.vue as it was not needed.
- Cleaned up the code by eliminating redundant checks and improving readability.

Update translations in falukant.json files

- Removed unused keys and cleaned up the structure in both German and English translation files.
- Ensured that all necessary translations are still present while removing obsolete entries.

Refactor BranchView and PoliticsView components for improved performance and clarity

- Removed caching logic for product prices in BranchView.vue to simplify the loading process.
- Streamlined the loadCurrentPositions method in PoliticsView.vue by eliminating unnecessary character ID checks and logging.
- Enhanced the user experience by ensuring that the application submission process is clearer and more efficient.

Clean up MoneyHistoryView and FamilyView components

- Removed the graph section from MoneyHistoryView.vue to simplify the UI.
- Adjusted the mood display logic in FamilyView.vue to ensure proper translation handling.
2026-02-09 11:44:26 +01:00
Torsten Schulz (local)
e7750c54da Enhance VocabService and VocabLessonView for improved vocabulary review: Updated VocabService to load previous lesson vocabulary for both review and mixed training modes. Added new computed properties and methods in VocabLessonView to manage vocabulary from previous lessons, including a mixed pool for enhanced training. Updated UI to reflect current lesson and mixed review status in the vocabulary trainer. 2026-02-09 11:17:04 +01:00
Torsten Schulz (local)
c317c55f88 Add TitleBenefit model and integrate benefits into FalukantService: Introduced TitleBenefit for managing title-related advantages, including tax exemptions and office eligibility. Updated service methods to utilize these benefits for character reputation, tax distribution, and allowed office types, enhancing gameplay mechanics and user experience. 2026-02-06 09:50:31 +01:00
Torsten Schulz (local)
3a129545c3 Add knowledge retrieval methods in FalukantService: Implemented _resolveLearningCharacterId to determine character IDs based on user input, and added getKnowledgeSingle and getKnowledgeForAll methods to fetch knowledge data for specific characters. Enhanced error handling for missing character IDs and improved knowledge aggregation logic. 2026-02-06 07:44:49 +01:00
Torsten Schulz (local)
7b641379e3 Refactor director data processing in FalukantService: Improved handling of null character references and added default values for character properties. This enhances data integrity and prevents potential runtime errors when processing director information. 2026-02-06 00:16:55 +01:00
Torsten Schulz (local)
c3cb072c34 Refactor FalukantService and update UI components: Removed debug logging from FalukantService, added age requirement messages in i18n files, and improved age validation display in PoliticsView. This enhances user experience and code clarity regarding age eligibility for political applications. 2026-02-06 00:14:16 +01:00
Torsten Schulz (local)
4e16635203 Refactor politics routes and service: Removed duplicate route for open politics in falukantRouter, updated falukantService to enhance logging for age validation in political applications, and ensured proper handling of open politics data in PoliticsView. This improves code clarity and debugging capabilities. 2026-02-06 00:04:49 +01:00
Torsten Schulz (local)
ff0af7baa0 Implement age validation for political applications in FalukantService: Added MIN_AGE_POLITICS_DAYS constant and logic to check user age before allowing applications. Updated PoliticsView to reflect age eligibility and display appropriate hints. Enhanced error handling for age-related restrictions. 2026-02-06 00:00:11 +01:00
Torsten Schulz (local)
3d25c4ea75 Add executeReputationAction method in FalukantService: Implemented functionality to handle reputation actions for users, including daily limits, cooldowns, and cost checks. This update enhances user interaction with the reputation system and ensures proper transaction management. 2026-02-05 23:57:28 +01:00
Torsten Schulz (local)
0923331ba4 Add multiple-choice and gap-fill exercises for everyday conversations in Bisaya: Introduced new exercises focusing on common phrases and their meanings, enhancing language learning resources. Updated lesson duration for 'Alltagsgespräche - Teil 1' to 25 minutes for better engagement. 2026-02-05 23:42:17 +01:00
Torsten Schulz (local)
7fa250e28a Enhance OverviewView component: Added daemonSocket handling for WebSocket events, improved event processing, and removed deprecated production_ready event handling. This update ensures better responsiveness to socket messages and maintains data integrity in the UI. 2026-02-05 23:37:17 +01:00
Torsten Schulz (local)
e18bd6f51e Update z-index values in DialogWidget and OverviewView components to improve layout stacking context and ensure proper element visibility. 2026-02-05 10:46:16 +01:00
Torsten Schulz (local)
e724fde5b7 Update z-index values in DialogWidget and StatusBar components, and remove negative z-index in OverviewView component for improved layout and stacking context. 2026-02-05 08:41:15 +01:00
Torsten Schulz (local)
5d642d2dcb Update syncDatabase function to remove setupAssociations call: Added comments to clarify that associations should be set by the caller to prevent AssociationError during synchronization. 2026-02-05 08:25:38 +01:00
Torsten Schulz (local)
f54a56392a Update CSS styles in OverviewView component: Added relative positioning and z-index to enhance layout control and ensure proper stacking of elements. 2026-02-05 08:19:29 +01:00
Torsten Schulz (local)
a10334e891 Add watcher for branchId in DirectorInfo component: Implemented a watcher to trigger loadDirector method when branchId changes, enhancing data responsiveness in the UI. 2026-02-04 15:44:16 +01:00
Torsten Schulz (local)
c46a89168d Import ProductPriceHistory model in associations.js to establish necessary relationships for product pricing data management. 2026-02-04 15:37:41 +01:00
Torsten Schulz (local)
8548285d23 Initialize model associations in server setup: Import and invoke setupAssociations to ensure all models share the same instance, preventing EagerLoadingError and enhancing data integrity before loading the app and services. 2026-02-04 15:27:46 +01:00
Torsten Schulz (local)
d57aedc5d3 Refactor vehicle loading in FalukantService: Update logic to load vehicle types and transports using separate queries, improving performance and preventing EagerLoadingError. Simplify data retrieval by mapping vehicle types and organizing transports by vehicle ID, enhancing code clarity and efficiency. 2026-02-04 15:20:40 +01:00
Torsten Schulz (local)
109a640fe2 Refactor child character loading in FalukantService: Update logic to load child relations using separate queries, improving performance and preventing EagerLoadingError. Simplify data retrieval by eliminating unnecessary eager loading and enhancing clarity in the code structure. 2026-02-04 15:16:05 +01:00
Torsten Schulz (local)
60e9e51029 Refactor relationship loading in FalukantService: Update logic to load relationships without eager loading, preventing EagerLoadingError. Enhance data retrieval by using separate queries for traits and moods, improving performance and reliability. 2026-02-04 15:12:36 +01:00
Torsten Schulz (local)
1b43697d06 Refactor trait and mood field names in FalukantService: Update database query conditions to use camelCase for traitId and moodId, ensuring consistency with model definitions and improving code readability. 2026-02-04 15:07:05 +01:00
Torsten Schulz (local)
4fa831d586 Update primary key constraints in promotional gift models: Set giftId and traitId as primary keys in PromotionalGiftCharacterTrait and PromotionalGiftMood models to ensure data integrity. Enhance FalukantService to load character traits and user house data with separate queries, improving performance and preventing EagerLoadingError. 2026-02-04 15:05:19 +01:00
Torsten Schulz (local)
db6ddb4af7 Refactor user house retrieval in FalukantService: Update logic to check for user ID before querying UserHouse, preventing unnecessary database calls and improving error handling. Maintain separate queries for UserHouse and relationships to avoid EagerLoadingError. 2026-02-04 14:20:22 +01:00
Torsten Schulz (local)
627ab501c9 Refactor user and relationship data retrieval in FalukantService: Update loading logic to use separate queries for UserHouse and relationships, improving reliability and preventing EagerLoadingError. Enhance heir selection UI with new translations in German and English, providing better user guidance during character selection. 2026-02-04 14:12:25 +01:00
Torsten Schulz (local)
da9578bfca Refactor user and relationship loading in FalukantService: Replace eager loading of UserHouse and relationships with separate queries to prevent EagerLoadingError. This change enhances data retrieval reliability and maintains performance during user-related operations. 2026-02-04 14:01:28 +01:00
Torsten Schulz (local)
c9d7b6f557 Add product price history model and database schema: Implement associations for ProductPriceHistory with ProductType and RegionData. Update FalukantService to utilize active character for user-related operations. Ensure product price history table exists in the database with appropriate structure and indexing. 2026-02-04 09:02:51 +01:00
Torsten Schulz (local)
6f7d112acd Enhance Bisaya course content creation: Update SQL query to include owner user ID and improve exercise handling logic. Implement checks for existing exercises and placeholder replacements for review lessons, ensuring better management of lesson content and user feedback. 2026-02-02 09:58:35 +01:00
Torsten Schulz (local)
feec877cb8 Add new exercises and vocabulary tests for Bisaya language course: Introduce multiple-choice questions for Week 1, covering greetings, family terms, and common phrases. Enhance learning materials with explanations for each question to aid understanding. 2026-02-02 09:47:59 +01:00
Torsten Schulz (local)
7001d88c8b Adjust character positioning in OverviewView: Change the bottom offset of the character foreground from 10px to -15px to improve visual alignment within the user interface. 2026-02-02 09:35:16 +01:00
Torsten Schulz (local)
aa0a378fdc Update character styling in OverviewView: Adjust character positioning and dimensions by changing the bottom offset to 10px and increasing width and height to 55%. This enhances the visual representation of characters in the user interface. 2026-02-02 09:03:33 +01:00
Torsten Schulz (local)
06819a9a6a Add avatar display logic in OverviewView: Introduce dynamic avatar styling based on user gender and age, enhancing character representation. Implement age group categorization for precise avatar positioning and dimensions, improving visual consistency in the user interface. 2026-02-02 08:53:47 +01:00
Torsten Schulz (local)
fcf0d36902 Implement noBackground prop in Character3D component: Add functionality to conditionally render the background and background image based on the noBackground prop. Update OverviewView to utilize the new prop, enhancing the character display logic and improving visual customization options. 2026-02-02 08:46:12 +01:00
Torsten Schulz (local)
20314e868e Enhance proposal generation logic in FalukantService: Refactor character selection process to include region and age filters, improving the randomness and relevance of director character proposals. Implement fallback mechanism for character retrieval to ensure availability, enhancing overall proposal generation reliability. 2026-02-02 08:24:28 +01:00
Torsten Schulz (local)
e442b5dca7 Refactor trigger creation logic: Update the created_at and updated_at fields to use the election date instead of the current timestamp, ensuring accurate term end calculations. Enhance socket event handling in StatusBar component by implementing setup and teardown methods for improved event management and user notifications. 2026-02-02 07:48:53 +01:00
Torsten Schulz (local)
a9676b90f8 Enhance supervisor office validation in falukantService: Update error handling to provide clearer messages when no supervisor position exists or when the position is vacant. This change improves user feedback during application processes by ensuring users understand the requirements for supervisor office fulfillment. 2026-01-31 00:23:20 +01:00
Torsten Schulz (local)
21d37fc708 Refactor event handling in CalendarView: Simplify event update and creation logic by removing unnecessary response handling. Implement event reloading after save and delete operations to ensure a clean state. This enhancement improves the reliability of event management in the calendar. 2026-01-30 15:43:28 +01:00
Torsten Schulz (local)
4b1554757e Add widget functionality for birthdays, upcoming events, and mini calendar: Implement new API endpoints in calendarController and calendarService to retrieve upcoming birthdays and events, as well as mini calendar data. Update calendarRouter to include widget routes and enhance DashboardWidget to dynamically render new widget components. This update improves user experience by providing quick access to important calendar information. 2026-01-30 15:14:37 +01:00
Torsten Schulz (local)
9530b7b563 Add friends' birthdays feature: Implement API endpoint to retrieve friends' birthdays for a specified year, enhance calendar service to handle visibility checks, and update CalendarView to display birthday events with distinct styling. This update improves user experience by allowing users to view important dates of their friends. 2026-01-30 14:59:32 +01:00
Torsten Schulz (local)
1e2ee0de12 Add all-day event functionality to CalendarView: Introduce a new section for displaying all-day events in both week and day views. Update localization files to include translations for 'All Day' in English and German. Enhance event handling methods to support all-day events, improving the overall calendar experience. 2026-01-30 14:43:07 +01:00
Torsten Schulz (local)
7fec6ca636 Improve date handling in CalendarView: Add comments to clarify the logic for setting the date to the first of the month to prevent overflow issues when navigating between months. This enhancement aids in maintaining accurate date transitions in the calendar view. 2026-01-30 14:41:02 +01:00
Torsten Schulz (local)
5069551a39 Refactor date handling in CalendarView: Update date formatting to use local timezone instead of UTC, enhancing accuracy in date representation. Introduce a new helper method for consistent date formatting across the component. This change improves the overall user experience by ensuring dates are displayed correctly. 2026-01-30 14:35:08 +01:00
Torsten Schulz (local)
b2b1ec7a67 Add calendar feature: Integrate calendarRouter and CalendarEvent model, enhance CalendarView with API interactions for event management, and update localization files for error handling in both English and German. This update improves the calendar functionality and user experience. 2026-01-30 14:29:11 +01:00
Torsten Schulz (local)
03bbda0ac2 Update calendar localization and enhance CalendarView: Add new entries, edit options, selection info, and form fields in both English and German localization files. Improve CalendarView component with new event dialog and selection handling for a better user experience. 2026-01-30 14:17:04 +01:00
Torsten Schulz (local)
fe3ff09363 Enhance calendar functionality in personal section: Implement detailed calendar views (month, week, workweek, day) in CalendarView component. Update localization files for English and German to include translations for calendar features such as views, weekdays, and months. This update improves user experience by providing a comprehensive calendar interface. 2026-01-30 14:07:28 +01:00
Torsten Schulz (local)
fe13adfdff Implement personal section in navigation: Add a new 'personal' menu item with sub-items for language learning and calendar. Update localization files for English and German to include translations for the new section. Integrate personal routes into the router configuration for navigation. 2026-01-30 13:53:27 +01:00
Torsten Schulz (local)
b2b42d1eec Refactor DashboardWidget to use dynamic widget components: Replace static slot content with a dynamic component rendering based on the endpoint prop. This change simplifies the widget structure and enhances flexibility by allowing different widget types to be displayed. Additionally, update error handling to provide more specific error messages. 2026-01-30 13:42:22 +01:00
Torsten Schulz (local)
28266cd985 Remove unused drag-and-drop indicators in LoggedInView: Eliminate placeholder elements and associated styles for drop zones to streamline the widget rearrangement interface. This change simplifies the code and enhances clarity in the drag-and-drop functionality. 2026-01-30 13:38:35 +01:00
Torsten Schulz (local)
68bc7590fa Refactor age display logic in DashboardWidget: Simplify age representation to always show years, removing the conditional check for days. This change streamlines the age display functionality. 2026-01-30 13:34:02 +01:00
Torsten Schulz (local)
ecac6bb8fe Enhance drag-and-drop functionality in LoggedInView: Update event handling to include event parameters for improved debugging and clarity. Add console logs to track drag-and-drop actions, enhancing the user experience during widget rearrangement. 2026-01-30 13:29:01 +01:00
Torsten Schulz (local)
ebd945c5a7 Refine drag-and-drop functionality in LoggedInView: Simplify event handling for drag-and-drop actions by removing unnecessary parameters and updating placeholder comments for clarity. This change aims to enhance user experience during widget rearrangement. 2026-01-30 13:15:03 +01:00
Torsten Schulz (local)
76c085b44f Refine drag-and-drop behavior in LoggedInView: Update drop event handling to prevent event propagation and improve widget insertion logic. Adjust drop target determination to enhance user experience during widget rearrangement. 2026-01-30 12:03:12 +01:00
Torsten Schulz (local)
6cca75350e Improve drag-and-drop indicators in LoggedInView: Enhance visual cues for widget insertion by updating placeholder comments and adding event handlers for drag-and-drop actions. This update aims to provide clearer instructions for users during widget rearrangement. 2026-01-30 11:44:08 +01:00
Torsten Schulz (local)
9525ecbb07 Enhance drag-and-drop experience in DashboardWidget: Implement a visual drag ghost image during widget dragging for improved user feedback. Adjust dragging state styles, including opacity and border, to better indicate active dragging. This update aims to refine the overall interaction and visual cues during widget rearrangement. 2026-01-30 11:13:51 +01:00
Torsten Schulz (local)
8963e31690 Refine DashboardWidget and LoggedInView styles: Adjust transition effects and dragging state in DashboardWidget for improved visual feedback. Update grid row height in LoggedInView for better responsiveness and enhance drop indicator styling for a more polished user experience. 2026-01-30 10:44:46 +01:00
Torsten Schulz (local)
9da4f7dca1 Enhance drag-and-drop functionality in Dashboard: Update styles for dragging state in DashboardWidget, including opacity and box-shadow adjustments. Improve LoggedInView by adding drop indicators for better user experience during widget rearrangement. Refactor drag-and-drop logic to maintain visual cues and ensure smoother interactions. 2026-01-30 10:30:07 +01:00
Torsten Schulz (local)
75ee2fdbd0 Update age representation in DashboardWidget: Modify falukantAgeLabel computed property to display age in days if less than a year, otherwise show in years. Add localization for "days" in both German and English language files to support the new age format. 2026-01-30 10:05:30 +01:00
Torsten Schulz (local)
c747176123 Adjust dashboard grid row height in LoggedInView for improved layout: Change grid-auto-rows from 420px to 200px to enhance responsiveness and better accommodate dynamic content. 2026-01-30 09:54:55 +01:00
Torsten Schulz (local)
fd758da93d Update DashboardWidget and LoggedInView styles: Adjust min-height and max-height properties for better layout flexibility. Enhance dashboard grid cell styling to support dynamic content display and improve overall UI responsiveness. 2026-01-30 09:26:00 +01:00
Torsten Schulz (local)
595f6e3a7a Improve AppNavigation item handling: Update the logic to only expand items with non-empty children, enhancing user experience by preventing unnecessary interactions on items without submenus. 2026-01-30 09:05:55 +01:00
Torsten Schulz (local)
b1f0938b81 Enhance DashboardWidget functionality: Integrate Vuex state management for socket connections, enabling real-time updates for Falukant widgets. Refactor computed properties and methods to handle socket events and improve data fetching logic. Update localization for age representation and adjust styles for better UI presentation. 2026-01-30 08:18:50 +01:00
Torsten Schulz (local)
d5a6acc819 Refactor dashboard widget management: Update dashboardService to handle user-specific widget configurations with create and update logic. Enhance LoggedInView to support adding the same widget type and display error messages for save operations. Ensure effective endpoint handling for widgets and improve UI interactions. 2026-01-30 07:31:38 +01:00
Torsten Schulz (local)
797bcac94d Enhance character name display in DashboardWidget: Refactor character name construction logic in FalukantService to include title handling and create a new computed property for display name in DashboardWidget. Update styles for gender display and ensure proper localization for age representation. 2026-01-29 17:28:58 +01:00
Torsten Schulz (local)
2ba32a4a7f Refactor DashboardWidget and LoggedInView: Update DashboardWidget to display a single news article instead of a list, enhancing user experience. Remove logout button and related functionality from LoggedInView to streamline the interface. 2026-01-29 17:26:43 +01:00
Torsten Schulz (local)
75051322d5 Fix conditional rendering in DashboardWidget: Change v-else-if to v-if for newsDataResults to ensure proper display of news articles when data is available. 2026-01-29 17:22:53 +01:00
Torsten Schulz (local)
084bacc20d Add news widget functionality: Integrate newsRouter for fetching news data, update initializeWidgetTypes to include news endpoint, and enhance DashboardWidget component to display news articles with pagination support. Update LoggedInView to manage widget request counters for unique endpoint handling. 2026-01-29 17:20:06 +01:00
Torsten Schulz (local)
ab5620dea8 Add dashboard widget functionality: Implement getDashboardWidget method in FalukantService to retrieve compact user data for the dashboard. Update FalukantController and router to expose the new endpoint, and enhance DashboardWidget component to display user-specific information including character name, gender, age, money, unread notifications, and children count. 2026-01-29 17:03:32 +01:00
Torsten Schulz (local)
c53f01793f Add widget management functionality: Implement getAvailableWidgets method in dashboardService to retrieve widget types, and create corresponding API endpoint in dashboardRouter. Update LoggedInView to allow users to select and add widgets dynamically, enhancing dashboard customization options. 2026-01-29 16:57:12 +01:00
Torsten Schulz (local)
3769f95f63 Add dashboard functionality: Integrate dashboardRouter and UserDashboard model, enabling user-specific dashboard configurations. Update LoggedInView to support dynamic widget management, including adding, removing, and saving widget configurations, enhancing user experience and interactivity. 2026-01-29 16:52:54 +01:00
Torsten Schulz (local)
17803e31e1 Refactor inventory handling in FalukantService: Update product transport logic to retrieve all stocks for a branch, improving inventory checks and ensuring accurate transport cost calculations. Implement locking during inventory updates to maintain data integrity during transactions. 2026-01-29 16:44:02 +01:00
Torsten Schulz (local)
2b13979fe7 Enhance FalukantService with character caching and optimized city retrieval: Introduce caching for cities with branch types to reduce database queries, and streamline character retrieval logic. Update product and knowledge fetching to improve performance and maintainability. 2026-01-29 16:04:43 +01:00
Torsten Schulz (local)
d0f98cdb81 Add batch processing for product price retrieval: Implement getProductPricesInCitiesBatch method in FalukantService for handling multiple product price requests in a single API call. Update FalukantController and router to support new endpoint, and refactor RevenueSection and SaleSection components to utilize batch processing for improved performance and reduced API calls. 2026-01-29 15:58:31 +01:00
Torsten Schulz (local)
a7c159a4af Refactor FalukantService and SaleSection components: Optimize product and knowledge retrieval by using Promise.all for concurrent database queries, improving performance. Additionally, reorganize the speedLabel method for better readability and maintainability, ensuring accurate localization handling for transport speed values. 2026-01-29 15:20:38 +01:00
Torsten Schulz (local)
c16574d9e2 Refactor price loading logic in RevenueSection and SaleSection components: Replace for-loops with Promise.all for concurrent API requests, improving performance and responsiveness. This change enhances the handling of loading states and ensures better management of price data retrieval. 2026-01-29 15:12:13 +01:00
Torsten Schulz (local)
bbd0b731a4 Refactor SaleSection component: Introduce methods section to organize component logic, enhancing readability and maintainability. This change improves the structure of the component by clearly separating computed properties and methods. 2026-01-29 15:11:16 +01:00
Torsten Schulz (local)
769b2b788a Add synchronous price calculation method: Introduce calcRegionalSellPriceSync for improved performance in price calculations when worthPercent is known. Refactor getAllProductPricesInRegion to utilize this new method, enhancing efficiency by reducing database calls. Update BranchView to manage product prices cache with regionId for better data handling. 2026-01-29 15:06:38 +01:00
Torsten Schulz (local)
a32af9a8e4 Refactor speedLabel method across components: Enhance localization handling for speed values by adding support for object types and improving fallback logic. This change ensures more accurate translations and better user experience in displaying transport speed information. 2026-01-29 14:22:25 +01:00
Torsten Schulz (local)
d6568b2beb Remove unused logging for queries in check-knowledge-pkey.js to streamline output and enhance clarity in database performance diagnostics. 2026-01-29 14:06:43 +01:00
Torsten Schulz (local)
3ede2f7a66 Enhance database performance diagnostics: Add detailed logging for unused primary key index and implement error handling for query statistics retrieval. Additionally, automate ANALYZE execution for affected tables after index creation to ensure PostgreSQL optimizes query performance. This improves clarity on index usage and enhances overall database performance management. 2026-01-29 14:05:24 +01:00
Torsten Schulz (local)
19131a0296 Refactor database performance diagnostics: Update connection pool diagnostics in diagnose-db-performance.js to improve error handling and enhance console output clarity. This change ensures more accurate user feedback regarding database connection pooling. 2026-01-29 14:03:15 +01:00
Torsten Schulz (local)
4355c1898a Refactor connection pool diagnostics in diagnose-db-performance.js: Update pool configuration retrieval to use Sequelize config, improve error handling, and enhance console output for better clarity on pool status. This change ensures more accurate diagnostics and user feedback regarding database connection pooling. 2026-01-29 13:56:46 +01:00
Torsten Schulz (local)
debf95cf2d Refactor database performance diagnostics: Update SQL queries in diagnose-db-performance.js to use 'relname' instead of 'tablename' for improved accuracy in table and index size calculations. This change enhances the clarity and correctness of performance diagnostics. 2026-01-29 13:55:07 +01:00
Torsten Schulz (local)
73db3771ee Update StatusBar component: Refactor rendering logic for status items, improve icon and label display, and enhance CSS for better alignment and styling. This change aims to boost visual clarity and overall user experience in the status bar. 2026-01-29 13:29:42 +01:00
Torsten Schulz (local)
822ac5984b Refactor StatusBar component: Improve status item rendering by enhancing icon and label display, and update CSS for better alignment and styling. This change enhances the visual clarity and user experience of the status bar. 2026-01-29 11:58:15 +01:00
Torsten Schulz (local)
d1e150b306 Enhance MoneyHistoryGraphDialog: Add axis labels for better data visualization, improve graph scaling logic, and implement money and date formatting methods. Update localization files to include "yesterday" translations in German and English, enhancing user experience and clarity in financial data representation. 2026-01-29 11:05:56 +01:00
Torsten Schulz (local)
f612be108e Add money history graph feature: Implement moneyHistoryGraph method in FalukantService and corresponding controller and router updates. Enhance frontend with a new dialog for displaying money history over various time ranges, including localization updates for German and English. This improves user experience by providing visual insights into financial data. 2026-01-29 10:40:13 +01:00
Torsten Schulz (local)
618fcad383 Fix localization key in NobilityView: Update the translation key for the next title display to ensure correct localization in the advance section, enhancing user experience. 2026-01-29 09:45:48 +01:00
Torsten Schulz (local)
0278b99cb2 Add reputation actions and localization updates: Implement getReputationActions method in FalukantService, enhancing reputation management. Update German and English localization files to include new reputation action terms and mood descriptions, improving user experience and clarity. 2026-01-29 09:37:34 +01:00
Torsten Schulz (local)
67574029aa Enhance date formatting in NobilityView: Update formatDate method to display time for today's or future dates, improving user experience by providing more relevant information. 2026-01-29 09:26:21 +01:00
Torsten Schulz (local)
b45d309bf1 Refactor NobilityView: Remove debug logs and improve conditional rendering for advance section. Add cooldown message styling for better user feedback when advancement is not possible. 2026-01-29 09:23:24 +01:00
Torsten Schulz (local)
60b24ad5e0 Enhance NobilityView with debugging information: Add conditional rendering for advance section based on availability of next title information. Implement detailed console logs for loading and advancing nobility data, improving error handling and debugging capabilities. 2026-01-29 09:20:10 +01:00
Torsten Schulz (local)
cace68b610 Refactor association keys in setupAssociations: Update foreign key naming conventions in Party and TitleOfNobility associations for consistency and clarity. Enhance error handling in FalukantService to ensure party ID is present before adding invited nobilities. 2026-01-29 09:05:38 +01:00
Torsten Schulz (local)
3c98f784db Add reputation actions endpoint: Implement getReputationActions method in FalukantService, update FalukantController to wrap the new method, and add corresponding route in falukantRouter for retrieving reputation actions. 2026-01-29 08:59:00 +01:00
Torsten Schulz (local)
10da8eaa3b Refactor character name handling in enrichNotificationsWithCharacterNames: Update comments for clarity on character_name and characterName usage. Enhance localization by adding success messages in German and English translations. 2026-01-29 07:46:17 +01:00
Torsten Schulz (local)
ef0d616cc8 Implement migration to make church_application supervisor_id nullable: Enhance functionality by allowing supervisor_id to be null, improving flexibility in application processing. Add logging for migration success and error handling. 2026-01-28 17:07:11 +01:00
Torsten Schulz (local)
fb72823ebc Update supervisorId handling in ChurchApplication and FalukantService: Allow supervisorId to be null for entry-level positions, enhancing flexibility in application processing. Improve prerequisite office type updates in initializeFalukantTypes for better data integrity. 2026-01-28 17:02:27 +01:00
Torsten Schulz (local)
29868b01bb Enhance logging and validation in getAvailableChurchPositions: Add detailed console logs for office type requirements and user qualifications, improving debugging and ensuring correct handling of prerequisite office types. 2026-01-28 16:57:46 +01:00
Torsten Schulz (local)
e31aa564fc Add church office requirements validation in FalukantService: Implement checks for prerequisite office types when determining available positions, enhancing the application process for church offices based on user qualifications. 2026-01-28 16:52:44 +01:00
Torsten Schulz (local)
3e1772ab27 Remove unused supervisor assignment in FalukantService: Clean up code by eliminating the conditional block that sets the supervisor object, streamlining the availablePositions logic. 2026-01-28 16:47:57 +01:00
Torsten Schulz (local)
4e71bb8bf5 Add region relationship to ChurchOffice model: Establish associations between ChurchOffice and RegionData, allowing for better organization of church offices by region. Enhance logging in getChurchOverview method for improved debugging and error handling. 2026-01-28 16:45:40 +01:00
Torsten Schulz (local)
061d5a20c9 Add church management features: Implement endpoints for church overview, available positions, supervised applications, and application processing in FalukantService and FalukantController. Update router to include new routes for these functionalities, enhancing church-related operations. 2026-01-28 16:41:19 +01:00
Torsten Schulz (local)
10b68a6824 Add bulk pricing retrieval for products in region: Implement getAllProductPricesInRegion method in FalukantService, update FalukantController and router to support new endpoint, and modify BranchView to utilize bulk request for improved performance. 2026-01-28 15:18:26 +01:00
Torsten Schulz (local)
40b139c028 Refactor ProductType model: Remove unused sellCostMinNeutral and sellCostMaxNeutral fields for cleaner code and improved maintainability. 2026-01-28 15:13:39 +01:00
Torsten Schulz (local)
0c1b79bcc3 Enhance error handling in FalukantService: Add validation for product sellCost in calcRegionalSellPrice and getProductPriceInRegion methods, ensuring proper error messages are logged when sellCost is undefined or null. 2026-01-28 15:05:28 +01:00
Torsten Schulz (local)
72c2fa158f Update FalukantService to include character ID in attributes and enhance logging in PoliticsView for better debugging of character data retrieval. 2026-01-28 14:58:11 +01:00
Torsten Schulz (local)
3f1dda6f34 Enhance logging in PoliticsView: Add detailed console logs for API responses and error handling in loadCurrentPositions and loadOwnCharacterId methods. Improve isOwnPosition method with additional logging for better debugging and clarity. 2026-01-28 14:56:07 +01:00
Torsten Schulz (local)
80bced3d97 Add holder ID to character object in FalukantService: Include the holder's ID in the character data structure to enhance user identification and data integrity. 2026-01-28 14:52:08 +01:00
Torsten Schulz (local)
bf9f204159 Implement own position highlighting in PoliticsView: Add functionality to load and display the user's own character ID, enhancing the UI by highlighting positions associated with the user. Update styles for better visibility of own positions in the table. 2026-01-28 14:47:20 +01:00
Torsten Schulz (local)
efab6cef79 Add lay-preacher office and update prerequisites in FalukantTypes; enhance church localization in English and German 2026-01-28 14:24:24 +01:00
Torsten Schulz (local)
8367927361 Remove debug logging from getFalukantUserByHashedId and getChildren methods in FalukantService for cleaner code and improved performance. 2026-01-28 13:44:12 +01:00
Torsten Schulz (local)
7cfebcf13d Enhance health activity error handling: Implement detailed error responses in FalukantController for 'tooClose' scenarios, including retry timing. Update localization files for improved user feedback on health measures and errors. Refactor error handling in HealthView to display appropriate messages based on error responses. 2026-01-28 13:34:42 +01:00
Torsten Schulz (local)
98fe68638c Improve error handling in FalukantController: Enhance response structure for error objects by including additional error data while maintaining status code integrity. This change allows for more informative error messages in the API response. 2026-01-28 13:29:15 +01:00
Torsten Schulz (local)
3a868f4500 Update English localization file: Reorganize JSON structure for improved readability and maintainability, ensuring consistent formatting across keys and values. 2026-01-28 11:55:27 +01:00
Torsten Schulz (local)
ea8b188d96 Füge Funktion zum Abbrechen der Werbung hinzu: Implementiere cancelWooing in FalukantService und FalukantController, aktualisiere FamilyView für die Benutzeroberfläche und verbessere die Fehlermeldungen bei vorzeitigen Abbrüchen. 2026-01-28 11:53:34 +01:00
Torsten Schulz (local)
8922545120 Verbessere Fehlerbehandlung beim Geschenkeversand: Füge Unterstützung für Retry-Nachricht und verbessere die Lokalisierung der Fehlermeldungen in FamilyView hinzu. 2026-01-26 17:15:36 +01:00
Torsten Schulz (local)
5d5923cf5c Enhance gift sending logic: Implement retry mechanism for 'tooOften' error in FalukantService and update error handling in FamilyView to display retry time. 2026-01-26 16:45:13 +01:00
Torsten Schulz (local)
d9b694ee4b Enhance database connection management by introducing configurable pool settings and implementing a retry mechanism for transient connection issues. Updated Sequelize pool options to use environment variables for better flexibility and added a retry wrapper for initializing settings to handle connection timeouts gracefully. 2026-01-26 16:27:36 +01:00
Torsten Schulz (local)
ee3dda9476 Refactor SaleSection component: Simplify sell item and sell all logic, remove unnecessary state management, and improve UI feedback. Update translations and clean up unused code in i18n files. Optimize price loading in BranchView and remove legacy product loading in MoneyHistoryView. Streamline PoliticsView by removing own character ID handling and related logic. 2026-01-26 16:03:48 +01:00
Torsten Schulz (local)
a6f9d94d24 Remove deprecated relationship change log migration and enhance error handling in FalukantService for partner retrieval 2026-01-26 10:10:22 +01:00
Torsten Schulz (local)
25ee3cbbb6 Add RelationshipChangeLog model and enhance character loading logic 2026-01-26 09:54:40 +01:00
Torsten Schulz (local)
caab99498c Add VocabLessonView component to socialRoutes
- Imported VocabLessonView component and updated the route definition to use the imported component directly instead of a dynamic import.
- This change enhances code readability and maintains consistency in how components are referenced in the routing configuration.
2026-01-23 14:42:21 +01:00
Torsten Schulz (local)
c1773ac9c7 Update color scheme across components to use new primary orange variable
- Replaced hardcoded orange color values with the new CSS variable for primary orange in multiple components, ensuring consistency in styling.
- Updated styles in DialogWidget, MessageboxWidget, SettingsWidget, SimpleTabs, and various Falukant components to enhance maintainability and readability.
2026-01-23 13:56:19 +01:00
Torsten Schulz (local)
5b5dba88ba Add notification messages for office filling in German and English locales
- Added new notification messages for when a political office is filled in both the German and English locale files.
- Ensured consistency in messaging across different languages to enhance user experience.
2026-01-23 13:53:32 +01:00
Torsten Schulz (local)
dd9f2147b6 Refactor and reintroduce character name enrichment logic in FalukantService
- Moved the enrichNotificationsWithCharacterNames function back into the FalukantService class, ensuring character names are correctly parsed and attached to notifications.
- Implemented a comprehensive ID collection and resolution mechanism for character references, enhancing the accuracy of character name assignments.
- Improved error handling during JSON parsing and ID resolution to maintain robustness in notification processing.
2026-01-23 13:46:06 +01:00
Torsten Schulz (local)
5acfc5d26a Enhance syncModelsAlways function to handle problematic ENUM changes
- Added logic to skip synchronization for specific tables with known ENUM issues, improving stability during model synchronization.
- Restored associations and virtual fields for models when skipping sync, ensuring data integrity and consistency.
2026-01-23 13:39:14 +01:00
Torsten Schulz (local)
2f61c479a1 Add connection management scripts to package.json
- Introduced new scripts: check-connections and cleanup-connections for managing database connections.
- These scripts enhance the backend's ability to monitor and maintain connection health.
2026-01-23 13:35:33 +01:00
Torsten Schulz (local)
9c5857df82 Update Sequelize configuration for improved connection management
- Reduced connection pool size and adjusted timeout settings to prevent connection limits.
- Added automatic reconnection handling for better resilience against connection losses.
- Introduced retry logic for specific connection errors to enhance stability during database interactions.
2026-01-23 13:28:31 +01:00
Torsten Schulz (local)
c25514f1af Add sync-tables script to package.json for table synchronization 2026-01-23 13:18:46 +01:00
Torsten Schulz (local)
a3585b34b6 Enhance query handling and foreign key management in sequelize.js
- Updated queryWithTimeout to support parameter replacements, improving query flexibility.
- Enhanced foreign key checks in syncModelsAlways to handle timeouts and errors more gracefully, ensuring robust logging and skipping problematic checks.
- Implemented a check for table existence before synchronization for large tables, preventing unnecessary sync operations and improving performance.
2026-01-23 13:13:35 +01:00
Torsten Schulz (local)
a7f53e7b83 Enhance Sequelize configuration and query handling in sequelize.js
- Added connection pool settings to optimize database connection management.
- Introduced a queryWithTimeout helper function to handle long-running queries, improving error handling and preventing indefinite hangs.
- Updated syncModelsAlways function to utilize queryWithTimeout for foreign key checks and cleanup operations, enhancing robustness and logging for better visibility during synchronization.
2026-01-23 12:48:26 +01:00
Torsten Schulz (local)
b92ee2c810 Implement model synchronization with timeout handling in sequelize.js
- Added a helper function to synchronize models with a timeout, improving error handling for long-running sync operations.
- Updated the syncModelsAlways function to utilize the new timeout feature, providing better control over model synchronization and preventing indefinite hangs.
- Enhanced logging to indicate model sync progress and timeout occurrences, improving visibility during deployment.
2026-01-23 10:37:47 +01:00
Torsten Schulz (local)
f2a1f240bc Enhance database cleanup operations in syncDatabase.js
- Added a helper function to check for table existence before performing cleanup operations, ensuring that invalid queries are avoided.
- Updated cleanup logic for church_office and church_application tables to only execute if the respective tables exist, improving robustness and preventing errors.
- Maintained existing logging for cleanup operations to provide visibility into the process.
2026-01-23 09:42:49 +01:00
Torsten Schulz (local)
a4e6a35e6d Add queryWithTimeout helper for database operations in syncDatabase.js
- Introduced a new helper function to execute database queries with a timeout, improving error handling for long-running queries.
- Updated multiple cleanup operations to utilize the new helper, enhancing code readability and maintainability.
- Added descriptive logging for each cleanup operation to provide better insights into the database synchronization process.
2026-01-22 17:18:27 +01:00
Torsten Schulz (local)
14199ce871 Optimize database cleanup process in syncDatabase.js
- Enhanced orphaned entry cleanup queries with LEFT JOIN for improved performance.
- Added logging for each cleanup step to provide better visibility into the process.
- Included additional cleanup for church_office and church_application tables to remove invalid entries.
- Updated vehicle condition handling to set legacy NULLs to 100 and clamp values between 0 and 100.
2026-01-22 17:07:04 +01:00
Torsten Schulz (local)
edf94aa29b Refactor church career validation in FalukantService
- Moved church career checks to a more logical position in the transaction flow.
- Improved error handling by ensuring character existence is validated before checking for church office.
- Cleaned up commented code for better readability and maintainability.
2026-01-22 16:54:29 +01:00
Torsten Schulz (local)
c1464c6ebc Implement church career management features
- Added endpoints for church career functionalities including overview, available positions, application submission, and application decision-making.
- Enhanced the FalukantController to handle church-related requests.
- Updated associations and models to support church office types and requirements.
- Integrated new routes in the falukantRouter for church career operations.
- Implemented service methods for managing church applications and checking church career status.
- Updated frontend components to display current positions, available positions, and manage applications with appropriate UI elements and loading states.
- Localized new church-related strings in both English and German.
2026-01-22 16:46:42 +01:00
Torsten Schulz (local)
22b1825940 Refactor character avatar rendering in OverviewView.vue
- Replaced 3D character rendering with a 2D avatar display for improved performance.
- Introduced dynamic avatar styling based on user gender and age group.
- Added computed properties for avatar and house styles to enhance visual representation.
- Cleaned up CSS to support the new avatar display structure.
2026-01-22 16:02:41 +01:00
Torsten Schulz (local)
386cb74149 Refactor source directory handling in modelsProxyService.js
- Introduced a cached source directory variable to optimize the retrieval of model paths.
- Updated comments for clarity on the source directory logic and its impact on cache validation.
2026-01-22 15:50:46 +01:00
Torsten Schulz (local)
f334ad2275 Enhance model path handling in modelsProxyService.js
- Refactored model source directory logic to dynamically select between production and local paths.
- Updated error messages to provide clearer context on model source lookup failures.
- Added package-lock.json to .gitignore to streamline dependency management.
2026-01-22 13:50:47 +01:00
Torsten Schulz (local)
0869044739 Remove package-lock.json files from frontend, backend, and root directories to streamline dependency management and reduce repository size. 2026-01-22 13:50:38 +01:00
Torsten Schulz (local)
9e2ccf1a62 Refactor model path handling in Character3D component
- Introduced a constant for the models API path to streamline model path construction.
- Updated modelPath method to utilize the new constant, improving code clarity and maintainability.
- Adjusted fallback model path logic to ensure consistent API usage.
2026-01-22 13:42:27 +01:00
Torsten Schulz (local)
037487df9a Implement request handling for 3D models in app.js
- Added middleware to prevent direct access to /models/ paths, directing users to use /api/models/ instead for optimized 3D models.
- Updated comments to clarify the purpose of the new middleware and its role in serving models through the API.
2026-01-22 13:40:03 +01:00
Torsten Schulz (local)
6b01625f56 Implement model optimization and caching for 3D characters
- Added a new modelsProxyRouter to handle requests for optimized 3D character models.
- Introduced modelsProxyService to manage GLB file optimization using gltf-transform with Draco compression.
- Updated app.js to include the new modelsProxyRouter for API access.
- Enhanced .gitignore to exclude model cache files.
- Added scripts for optimizing GLB models and updated README with optimization instructions.
- Integrated DRACOLoader in Character3D.vue for loading compressed models.
- Updated FamilyView.vue to streamline character rendering logic.
2026-01-22 13:24:47 +01:00
Torsten Schulz (local)
086ceee502 Update color scheme in AppHeader and AppNavigation components for visual consistency
- Changed background color in AppHeader.vue and AppNavigation.vue to a new shade for improved aesthetics.
- Adjusted hover states and submenu background colors in AppNavigation.vue to match the updated theme.
- Refactored FamilyView.vue to enhance layout with additional padding for better alignment of elements.
2026-01-22 12:56:53 +01:00
Torsten Schulz (local)
e6441c891b Update AppHeader and FamilyView components for improved styling and layout
- Changed background color in AppHeader.vue for enhanced visual appeal.
- Refactored FamilyView.vue to improve layout by introducing a flexbox structure for better alignment of relationship details and 3D character models.
- Added new CSS classes to support the updated layout and ensure responsive design.
2026-01-22 12:49:48 +01:00
Torsten Schulz (local)
d956ccca36 Enhance deployment scripts and frontend components for improved functionality and styling
- Added dependency installation step in deploy-frontend.sh and update-frontend.sh to ensure all required packages are available before building the frontend.
- Updated AppNavigation.vue to change background color for better visual appeal.
- Refactored FamilyView.vue to include 3D character models for both the user and their relationships, enhancing the visual representation of family dynamics.
- Modified OverviewView.vue to switch from 3D character rendering to a 2D avatar display, improving loading performance and user experience.
2026-01-22 12:39:24 +01:00
Torsten Schulz (local)
3bfe702b52 Update Vite configuration for improved module resolution and build settings
- Changed the import path for GLTFLoader to align with the latest Three.js structure.
- Added preserveSymlinks option to the build configuration for better symlink handling.
- Updated Rollup options to explicitly define no external modules, enhancing build clarity.
2026-01-22 12:31:20 +01:00
Torsten Schulz (local)
b71d29fba5 Update Vite configuration and Character3D component for improved module handling
- Added 'three' to the dedupe array in Vite config to optimize dependency resolution.
- Updated CommonJS options to enable transformation of mixed ES modules for better compatibility.
- Changed the import path for GLTFLoader in Character3D.vue to align with the latest Three.js structure.
2026-01-22 12:26:52 +01:00
Torsten Schulz (local)
9c8aae0470 Update Vite configuration to enhance dependency optimization and build settings
- Added 'three' and its GLTFLoader to the optimizeDeps include array for improved module resolution.
- Introduced custom Rollup options to prevent externalization of the 'three' library during the build process.
- Configured CommonJS options to include 'three' and node_modules for better compatibility with dependencies.
2026-01-22 12:24:57 +01:00
Torsten Schulz (local)
e07e07e57b Update color palette and styles across components for improved visual consistency
- Changed theme color in index.html to a brighter orange for better aesthetics.
- Introduced a modern color palette in styles.scss for enhanced readability and consistency.
- Updated various components (AppFooter, AppNavigation, DialogWidget, etc.) to utilize new color variables, ensuring a cohesive look throughout the application.
- Adjusted button styles and hover effects for improved user interaction feedback.
- Enhanced background colors and text colors for better contrast and visibility.
2026-01-22 12:22:05 +01:00
Torsten Schulz (local)
4d0cc97f96 Add 3D character rendering to Character3D component
- Integrated Three.js for 3D character visualization based on user gender and age.
- Simplified the character structure by removing outdated HTML elements and replacing them with a dynamic 3D model loader.
- Implemented model loading with fallback options and added animation capabilities for enhanced visual appeal.
- Updated CSS for the character container to ensure proper rendering and responsiveness.
2026-01-22 11:53:40 +01:00
1502 changed files with 6350 additions and 133108 deletions

0
.codex
View File

View File

@@ -1,9 +0,0 @@
---
description: C++-Worker unter src/ sind obsolet — nicht erweitern oder als Quelle für Spiellogik nutzen
alwaysApply: true
---
# Legacy C++ (`src/`)
- Verzeichnis **`src/`** (C++-Worker, WebSocket-Server): **obsolet**. Keine neuen Features, keine fachlichen Fixes dort planen oder umsetzen, sofern der Nutzer nicht ausdrücklich etwas anderes verlangt.
- Falukant-Hintergrundlogik: **Backend** (`backend/`), **externer Daemon**, **Frontend** — siehe `docs/LEGACY_CPP_WORKERS.md`.

View File

@@ -1,148 +0,0 @@
name: Deploy to production
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Detect vocab course changes
id: vocab_course_changes
shell: bash
run: |
set -euo pipefail
BASE="${{ gitea.event.before }}"
HEAD="${{ gitea.sha }}"
if [ -z "$BASE" ] || [[ "$BASE" =~ ^0+$ ]] || ! git cat-file -e "$BASE^{commit}" 2>/dev/null; then
BASE="HEAD~1"
fi
git diff --name-only "$BASE" "$HEAD" > changed-files.txt
cat changed-files.txt
COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)"
COURSE_SCRIPT_PATTERN='^backend/scripts/.*(bisaya|course|didactics|vocab)'
if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then
echo "force_deploy=true" >> "$GITHUB_OUTPUT"
else
echo "force_deploy=false" >> "$GITHUB_OUTPUT"
fi
if grep -E '^(backend/scripts/.*(bisaya|course|didactics|vocab)|backend/sql/.*vocab|backend/(migrations-active|migrations-archive)/.*vocab|docs/.*(COURSE|VOCAB|BISAYA|GERMAN_FOR_BISAYA))' changed-files.txt; then
echo "changed=true" >> "$GITHUB_OUTPUT"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E "$COURSE_SCRIPT_PATTERN" changed-files.txt >/dev/null; then
echo "course_scripts_changed=true" >> "$GITHUB_OUTPUT"
else
echo "course_scripts_changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E '^frontend/' changed-files.txt >/dev/null; then
echo "frontend_changed=true" >> "$GITHUB_OUTPUT"
else
echo "frontend_changed=false" >> "$GITHUB_OUTPUT"
fi
# Kurs-/Didaktik-Scripts werden vor dem Sync separat uebertragen.
# Fuer sie sind npm ci, Migrationen und ein Backend-Restart nicht noetig.
if grep -E '^backend/' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "backend_app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "backend_app_changed=false" >> "$GITHUB_OUTPUT"
fi
# App-Code-Änderungen, die einen echten Deploy benötigen
if grep -E '^(frontend/|backend/)' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "app_changed=false" >> "$GITHUB_OUTPUT"
fi
- name: Prepare SSH
run: |
mkdir -p ~/.ssh
printf "%s" "${{ secrets.PROD_SSH_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -p "${{ secrets.PROD_PORT }}" "${{ secrets.PROD_HOST }}" >> ~/.ssh/known_hosts
- name: Test SSH connection
run: |
ssh -i ~/.ssh/id_ed25519 \
-o StrictHostKeyChecking=no \
-o BatchMode=yes \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"echo SSH OK"
- name: Deploy vocab course scripts without app rebuild
if: steps.vocab_course_changes.outputs.course_scripts_changed == 'true' && steps.vocab_course_changes.outputs.backend_app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
shell: bash
run: |
set -euo pipefail
tar -czf - backend/scripts \
| ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"sudo -n -u yourpart tar -xzf - -C /opt/yourpart"
- name: Run deployment script
if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
run: |
DEPLOY_FLAGS=""
if [ "${{ steps.vocab_course_changes.outputs.force_deploy }}" = "true" ]; then
DEPLOY_FLAGS=""
elif [ "${{ steps.vocab_course_changes.outputs.backend_app_changed }}" = "true" ] && [ "${{ steps.vocab_course_changes.outputs.frontend_changed }}" != "true" ]; then
DEPLOY_FLAGS="--skip-frontend"
elif [ "${{ steps.vocab_course_changes.outputs.frontend_changed }}" = "true" ] && [ "${{ steps.vocab_course_changes.outputs.backend_app_changed }}" != "true" ]; then
DEPLOY_FLAGS="--skip-backend"
fi
DEPLOY_TARGET="${{ secrets.PROD_DEPLOY_TARGET }}"
if [ -z "$DEPLOY_TARGET" ]; then
DEPLOY_TARGET="/opt/yourpart-green"
fi
echo "Deploy-Flags: ${DEPLOY_FLAGS:-<none>}"
echo "Deploy-Target: $DEPLOY_TARGET"
ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"/home/tsschulz/deploy-yourpart-bluegreen.sh ${DEPLOY_TARGET} ${DEPLOY_FLAGS}"
- name: Skip full deployment (no app changes)
if: steps.vocab_course_changes.outputs.app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
run: |
echo "Kein Full-Deploy: Es wurden keine Frontend/Backend-App-Dateien geändert."
- name: Sync vocab course content
if: steps.vocab_course_changes.outputs.changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
run: |
# Decide whether to actually run the phase3 update on the server.
# By default we run the deploy script in --dry-run mode. To enable the
# actual run set the secret PHASE3_UPDATE=1 in the repo settings.
RUN_FLAG="--dry-run"
if [ "${{ secrets.PHASE3_UPDATE }}" = "1" ]; then
RUN_FLAG=""
fi
ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"cd /opt/yourpart && npm --prefix backend run sync:vocab-courses && if [ -x backend/scripts/deploy-phase3-update.sh ]; then bash backend/scripts/deploy-phase3-update.sh $RUN_FLAG; else echo 'deploy-phase3-update.sh not found or not executable'; fi"

View File

@@ -1,29 +0,0 @@
name: Android Security
on:
push:
paths:
- 'android/native/**'
- '.github/workflows/android-security.yml'
pull_request:
paths:
- 'android/native/**'
- '.github/workflows/android-security.yml'
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Android lint
working-directory: android/native
run: ./gradlew :app:lintProductionRelease
- name: Scan dependencies with OSV
uses: google/osv-scanner-action/osv-scanner-action@v2.0.2
with:
scan-args: |-
--recursive android/native

View File

@@ -1,50 +0,0 @@
name: Android Tests
on:
push:
paths:
- "android/native/**"
- ".github/workflows/android-tests.yml"
pull_request:
paths:
- "android/native/**"
- ".github/workflows/android-tests.yml"
permissions:
contents: read
jobs:
unit-tests:
name: JVM tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: android/native
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: gradle/actions/setup-gradle@v4
- run: ./gradlew :app:testLocalDebugUnitTest
instrumentation-tests:
name: Emulator tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: android/native
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: gradle/actions/setup-gradle@v4
- uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 35
target: google_apis
arch: x86_64
script: ./gradlew :app:connectedLocalDebugAndroidTest

10
.gitignore vendored Executable file → Normal file
View File

@@ -5,22 +5,17 @@
.depbe.sh
node_modules
node_modules/*
# package-lock.json wird versioniert (npm ci im Deploy braucht konsistente Locks zu package.json)
**/package-lock.json
backend/.env
backend/.env.local
backend/images
backend/images/*
backend/node_modules
backend/node_modules/*
frontend/.env
frontend/.env.android
frontend/node_modules
frontend/node_modules/*
frontend/dist
frontend/dist/*
frontend/scripts/.i18n-de-fr-cache.json
frontend/scripts/.falukant-fr-smooth-cache.json
frontend/ceb-locale-audit-report.json
frontedtree.txt
backend/dist/
backend/data/model-cache
@@ -29,6 +24,3 @@ build/*
.vscode
.vscode/*
.clang-format
android/native/.gradle/
android/native/build/
android/native/local.properties

0
.vscode/settings.json vendored Executable file → Normal file
View File

0
CHURCH_MODELS.md Executable file → Normal file
View File

0
CHURCH_OFFICES.md Executable file → Normal file
View File

0
CMakeLists.txt Executable file → Normal file
View File

0
CMakeLists.txt.user Executable file → Normal file
View File

0
CMakeLists.txt.user.d36652f Executable file → Normal file
View File

0
DEPLOYMENT.md Executable file → Normal file
View File

View File

@@ -1,259 +0,0 @@
# OAuth Credentials Setup Guide
Anleitung zum Sammeln der OAuth-Credentials für alle 5 Provider.
## Redirect URIs
Für alle Provider benötigst du folgende Redirect URIs (ersetze `www.your-part.de` mit deiner echten Domain):
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
Lokal zum Testen:
```
http://localhost:3000/auth/oauth/callback
http://localhost:3000/auth/oauth/user/callback
```
---
## 1. Google
### Credentials besorgen:
1. Öffne [Google Cloud Console](https://console.cloud.google.com/)
2. Erstelle ein neues Projekt oder wähle ein bestehendes
3. Navigiere zu **APIs & Services****Credentials**
4. Klick **+ CREATE CREDENTIALS** → **OAuth 2.0 Client IDs**
5. Wähle **Web application**
6. Füge unter **Authorized redirect URIs** hinzu:
- `https://www.your-part.de/auth/oauth/callback`
- `https://www.your-part.de/auth/oauth/user/callback`
7. Speichern und die **Client ID** und **Client Secret** kopieren
### .env:
```env
OAUTH_GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
OAUTH_GOOGLE_CLIENT_SECRET=your-client-secret
```
---
## 2. Microsoft Azure
### Credentials besorgen:
1. Öffne [Azure Portal](https://portal.azure.com/)
2. Navigiere zu **Azure Active Directory****App registrations****+ New registration**
3. Gib einen Namen ein (z.B. "YourPart OAuth")
4. Wähle **Accounts in any organizational directory (Any Azure AD directory - Multitenant)**
5. Bei **Redirect URI** wähle **Web** und füge ein:
- `https://www.your-part.de/auth/oauth/callback`
6. Klick **Register**
7. Notiere die **Application (client) ID**
8. Gehe zu **Certificates & secrets****+ New client secret**
9. Erstelle ein Secret und kopiere den **Value** (nicht die ID!)
10. Gehe zu **Token configuration** und stelle sicher, dass die richtigen Claims enthalten sind
### Zusätzliche URI hinzufügen:
1. Gehe zu **Authentication**
2. Unter **Redirect URIs** klick **+ Add URI**
3. Füge hinzu: `https://www.your-part.de/auth/oauth/user/callback`
### .env:
```env
OAUTH_MICROSOFT_CLIENT_ID=your-application-id
OAUTH_MICROSOFT_CLIENT_SECRET=your-client-secret-value
```
---
## 3. Keycloak
Keycloak ist ein Open-Source OIDC Provider. Du kannst ihn selbst hosten oder eine gehostete Lösung nutzen.
### Option A: Selbst gehostet mit Docker
```bash
docker run -d \
-p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:latest \
start-dev
```
Dann:
1. Öffne http://localhost:8080
2. Login mit `admin` / `admin`
3. **Realm erstellen**: Oben links Dropdown → **Create realm**
- Name: `yourpart` (oder beliebig)
4. Im neuen Realm: **Clients****Create client**
- Client ID: `yourpart`
- Client Protocol: `openid-connect`
- Access Type: `confidential`
5. Im **Settings** Tab:
- Valid Redirect URIs:
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
6. Speichern
7. Gehe zu **Credentials** Tab
- **Client Secret** kopieren
### Option B: Gehosteter Service
- [Keycloak.cloud](https://www.keycloak.cloud/) oder
- [Red Hat Managed Keycloak](https://www.keycloak.org/cloud/)
### .env:
```env
OAUTH_KEYCLOAK_ISSUER=https://your-keycloak-domain/realms/yourpart
OAUTH_KEYCLOAK_CLIENT_ID=yourpart
OAUTH_KEYCLOAK_CLIENT_SECRET=your-client-secret
```
---
## 4. ORY Hydra / ORY Cloud
ORY ist ein moderner OIDC Provider. Am einfachsten ist ORY Cloud.
### Option A: ORY Cloud (empfohlen)
1. Öffne [ORY Cloud Console](https://console.ory.sh/)
2. Registriere dich oder logge dich ein
3. Erstelle ein neues **Project**
4. Gehe zu **Applications**
5. Klick **Create New Application**
6. Gib einen Namen ein (z.B. "YourPart")
7. Unter **Redirect URLs** füge ein:
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
8. Speichern
9. Die **Client ID** und **Client Secret** werden angezeigt
10. Finde deine **Issuer URL** in den Project Settings (meist `https://your-project-slug.eu.hydra.cloud`)
### Option B: Selbst gehostet (komplex)
Siehe [ORY Hydra Dokumentation](https://www.ory.sh/hydra/docs/)
### .env:
```env
OAUTH_ORY_ISSUER=https://your-project-slug.eu.hydra.cloud
OAUTH_ORY_CLIENT_ID=your-client-id
OAUTH_ORY_CLIENT_SECRET=your-client-secret
```
---
## 5. ZITADEL
ZITADEL ist ein Zero-Trust Identity Platform als SaaS.
### Credentials besorgen:
1. Öffne [ZITADEL Console](https://zitadel.cloud/)
2. Registriere dich oder logge dich ein
3. Erstelle eine neue **Organization** (oder verwende die existierende)
4. Gehe zu **Projects** → **+ New Project**
5. Gib einen Namen ein (z.B. "YourPart")
6. Gehe zum Projekt → **Applications** → **+ New Application**
7. Wähle **Type: Web**
8. Gib einen Namen ein
9. Bei **Redirect URIs** füge ein:
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
10. Speichern
11. Unter **Client Information** kopiere:
- **Client ID**
- **Client Secret** (falls sichtbar, sonst im "CREDENTIALS" Tab generieren)
12. Finde deine **Issuer URL** in den Organization Settings (meist `https://your-instance.zitadel.cloud`)
### .env:
```env
OAUTH_ZITADEL_ISSUER=https://your-instance.zitadel.cloud
OAUTH_ZITADEL_CLIENT_ID=your-client-id
OAUTH_ZITADEL_CLIENT_SECRET=your-client-secret
```
---
## Komplette .env für alle 5 Provider
```env
# Google
OAUTH_GOOGLE_CLIENT_ID=...
OAUTH_GOOGLE_CLIENT_SECRET=...
# Microsoft
OAUTH_MICROSOFT_CLIENT_ID=...
OAUTH_MICROSOFT_CLIENT_SECRET=...
# Keycloak
OAUTH_KEYCLOAK_ISSUER=...
OAUTH_KEYCLOAK_CLIENT_ID=...
OAUTH_KEYCLOAK_CLIENT_SECRET=...
# ORY
OAUTH_ORY_ISSUER=...
OAUTH_ORY_CLIENT_ID=...
OAUTH_ORY_CLIENT_SECRET=...
# ZITADEL
OAUTH_ZITADEL_ISSUER=...
OAUTH_ZITADEL_CLIENT_ID=...
OAUTH_ZITADEL_CLIENT_SECRET=...
```
---
## Schnell-Checkliste
- [ ] Google: Client ID & Secret
- [ ] Microsoft: Application ID & Client Secret
- [ ] Keycloak: Issuer, Client ID, Secret
- [ ] ORY: Issuer, Client ID, Secret
- [ ] ZITADEL: Issuer, Client ID, Secret
- [ ] Alle Redirect URIs in den Providern konfiguriert
- [ ] .env datei aktualisiert
- [ ] Server neu gestartet (`npm restart`)
---
## Testing
Nach der Konfiguration:
1. Frontend öffnen: http://www.your-part.de
2. Auf "Login" oder Provider-Button klicken
3. Jeder verfügbare Provider sollte als Button angezeigt werden
4. Test: Mit jedem Provider einloggen
5. Test: Existender Nutzer → Einstellungen → Authentifizierung hinzufügen
---
## Troubleshooting
### "Invalid redirect URI"
- Stelle sicher, dass die Redirect URIs **exakt** übereinstimmen (inkl. `https://` vs `http://`)
- Beachte Trailing Slashes
### "Invalid client secret"
- Kopiere das Secret neu (nicht die ID)
- Manche Provider verstecken das Secret nach einmaliger Anzeige
### "Discovery endpoint not found"
- Überprüfe die Issuer URL (mit/ohne Trailing Slash)
- Für Keycloak: URL muss auf `/realms/xxx` enden
- Für ORY: URL darf nicht auf `/` enden
### Port-Konflikt lokal
- Keycloak benutzt `8080` → ändere auf: `docker run -p 8081:8080 ...`
- Stelle sicher, dass 3000 (Frontend) und 5000 (Backend) frei sind

0
PERFORMANCE_ANALYSIS.md Executable file → Normal file
View File

View File

@@ -1,3 +0,0 @@
## zum testen des push
Hinweis: Das Verzeichnis **`src/`** (C++-Worker) ist veraltet; siehe [`docs/LEGACY_CPP_WORKERS.md`](docs/LEGACY_CPP_WORKERS.md).

0
README_MATCH3_CAMPAIGN.md Executable file → Normal file
View File

0
SELL_OVERVIEW.md Executable file → Normal file
View File

0
SSL-SETUP.md Executable file → Normal file
View File

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>

View File

@@ -1,5 +0,0 @@
<project version="4">
<component name="ProjectRootManager" version="2">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/android.iml" filepath="$PROJECT_DIR$/.idea/android.iml" />
</modules>
</component>
</project>

6
android/.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@@ -1,605 +0,0 @@
# Android-App-Plan fuer YourPart3
Stand: 2026-07-08
## Ziel
Dieses Dokument plant eine Android-App fuer das bestehende YourPart3-Projekt unter `/android`.
Das Projekt besteht aktuell aus:
- `frontend`: Vue 3, Vite, Vuetify, Vue Router, Vuex, Axios, Socket.IO Client, Three.js
- `backend`: Node.js/Express 5, Sequelize, Redis-Sessiondaten, OAuth/OIDC, Socket.IO, REST-APIs
- Authentifizierung: Login liefert einen User mit `id`/`authCode`; API-Requests senden Header `userid` und `authcode`
- Realtime: Socket.IO fuer Backend-Events und separater Daemon-WebSocket fuer Falukant-Updates
- Deployment: Backend serviert die gebaute SPA aus `frontend/dist`
Backend-Implementierung ist nicht Teil dieses Android-Starts. Das vorhandene Backend wird als gegeben betrachtet; Android-seitig werden nur Kompatibilitaet, URLs, Auth-Header, OAuth-Weiterleitung und Realtime-Verbindungen getestet.
## Empfehlung
Die Android-App sollte in Phase 1 als Capacitor-App umgesetzt werden, nicht als nativer Rewrite.
Begruendung:
- Die bestehende App ist bereits eine grosse SPA mit vielen Views: Social Network, Falukant, Vokabeltrainer, Minigames, Kalender, Admin, Settings.
- Der Auth-Mechanismus und die vorhandenen API-Clients sind Web-orientiert und koennen in einer WebView nahezu unveraendert weiterlaufen.
- OAuth-Callback-Routen existieren bereits im Frontend (`/auth/oauth/callback`, `/auth/oauth/user/callback`).
- Socket.IO und WebSocket-Verbindungen funktionieren in Capacitor deutlich schneller als in einem nativen Rewrite.
- Ein nativer Rewrite wuerde zuerst API-Vertraege, Sessionmodell, Navigation, Offline-Strategie und UI-Komponenten neu definieren muessen.
Zielarchitektur Phase 1:
```text
/android
capacitor.config.ts
package.json
android/
Android-native Projektdateien, durch Capacitor generiert
/frontend
bestehende Vue/Vite-App
/backend
bestehende Express/API/Socket.IO-App
```
Capacitor verwendet den bestehenden `frontend`-Build als Web-Bundle und erzeugt daraus eine installierbare Android-App.
## Nicht-Ziele fuer Phase 1
- Kein kompletter nativer Kotlin/Jetpack-Compose-Rewrite.
- Keine Offline-First-Synchronisation fuer Falukant/Social/Vocab.
- Keine komplette Neugestaltung aller mobilen Screens.
- Keine API-Versionierung fuer mobile Clients, solange die App nur das bestehende Web-Frontend verpackt.
- Keine Play-Store-Verteilung vor Datenschutz-, Content- und OAuth-Pruefung.
- Keine Backend-Neuentwicklung und keine Backend-API-Neuplanung.
## Getroffene Entscheidungen
### App-Technologie
- Entscheidung: Capacitor mit lokal gebuendelter Vue/Vite-App.
- Kein nativer Kotlin-Rewrite in Phase 1.
- Kein reiner Remote-WebView-Wrapper auf `https://www.your-part.de`.
- Begruendung: Der vorhandene Funktionsumfang ist breit, Web-Auth und Socket.IO existieren bereits, und Capacitor ermoeglicht spaetere native Erweiterungen ohne sofortigen Rewrite.
### App-ID und Name
- App-ID: `de.yourpart.app`
- Launcher-Name: `YourPart`
- Android-Projektpfad: `/android`
- Capacitor `webDir`: `../frontend/dist`
### Ziel-Distribution
- Phase 1: interne Debug-/Test-APK.
- Phase 2: signiertes internes AAB/APK fuer Testgeraete.
- Play Store erst nach separatem Compliance-Check fuer Datenschutz, UGC, Moderation und Adult Content.
### Backend-Abgrenzung
- Backend bleibt unveraendert.
- Android nutzt die bestehenden REST-Endpunkte, Auth-Header, OAuth-Routen, Socket.IO-Events und Daemon-WebSocket-Events.
- Backendbezogene TODOs sind nur Test- und Konfigurationschecks. Falls ein Test scheitert, wird der konkrete Anpassungsbedarf danach separat entschieden.
### Admin-Bereich
- Admin-Routen bleiben in Phase 1 nicht priorisiert.
- Wenn Admin-Menues durch bestehende Berechtigungen sichtbar sind, werden sie nicht aktiv entfernt.
- Abnahmekriterien fuer Phase 1 gelten nur fuer normale Nutzerfunktionen.
### Adult-/Erotikbereiche
- Phase 1: vorhandenes Web-Gating bleibt bestehen, keine neue native Adult-Content-Funktion.
- Play-Store-Ziel ist blockiert, bis Altersfreigabe, UGC-Moderation, Melden/Blockieren, Datenschutz und Store-Policy separat geprueft sind.
- Fuer interne APK-Tests darf der Bereich technisch erreichbar bleiben, wenn der bestehende Account-/Altersstatus ihn erlaubt.
### OAuth
- Phase 1 startet mit Username/Passwort-Login als Pflichtfunktion.
- OAuth ist Phase-1-Testumfang, aber kein Blocker fuer das erste Debug-APK.
- Zielrichtung fuer OAuth: externer Browser bzw. System-Browser plus App Links, nicht OAuth in einer versteckten WebView erzwingen.
### Push Notifications
- Push ist nicht Teil des ersten Android-Scaffolds.
- Push wird nach stabiler App-Shell geplant, weil dafuer Device Tokens, Opt-in, Settings und Backend-Zustellung noetig sind.
### 3D / WebGL
- 3D-Charaktere werden im Android-Debug-Build initial per `VITE_DISABLE_3D=true` deaktiviert.
- Begruendung: Die Login-Seite rendert mehrere `Character3D`-Instanzen sofort. In Kombination mit CORS-Fehlern und vielen GLB-Kandidaten kann der Emulator-WebView-Renderer per OOM abstuerzen.
- Reaktivierung erfolgt erst nach erfolgreichem CORS-Test und separatem 3D-Performance-Test.
### Navigation
- Vue `createWebHistory` bleibt initial unveraendert.
- Hash-Routing wird nur eingefuehrt, wenn Capacitor-Tests echte Routing-Probleme zeigen.
- Android Back Button wird als native App-Anforderung in Phase 1 umgesetzt.
- Mobile Navigation bleibt Teil der Web-App, wird aber fuer Android als kompakte Hybrid-Navigation gehaertet: Header-Leiste, aufklappbares scrollbares Menue, keine dauerhaft sichtbare Desktop-Menueflaeche auf kleinen Displays.
### Sichere Speicherung
- Phase 1 darf bestehendes `localStorage`/`sessionStorage` weiterverwenden.
- Vor Play-Store-Release wird Auth-Persistenz auf Secure Storage/Android Keystore umgestellt.
## Technische Ausgangslage
### Frontend
- Zentrale API-Konfiguration: `frontend/src/utils/axios.js`
- API-Basis-URL: `frontend/src/utils/appConfig.js` ueber `VITE_API_BASE_URL`
- Auth-Header: `userid` und `authcode`
- Persistenz: `localStorage` oder `sessionStorage` fuer `isLoggedIn`, `user`, `userid`
- Router: `createWebHistory`, viele Clean-URL-Routen
- Realtime: `socket.io-client` ueber `VITE_SOCKET_IO_URL`
- Daemon-WebSocket: ueber `VITE_DAEMON_SOCKET`
- 3D/Assets: Three.js und Modelle ueber `/api/models` bzw. statische Assets
### Backend
- CORS erlaubt aktuell konfigurierte Origins und lokale Web-Origins.
- Auth-Middleware prueft `userid` und `authcode`.
- OAuth startet serverseitig per Redirect.
- Socket.IO erlaubt aktuell `origin: '*'`.
- Backend serviert SPA-Fallback fuer Nicht-API-Routen.
## Android-Strategie
### Phase 1: Capacitor Shell
Die Android-App laedt nicht die Produktionswebsite remote, sondern nutzt das lokal gebundelte Vite-Build-Artefakt.
Vorteile:
- App startet auch dann, wenn die Website selbst nicht als Web-Seite geladen werden muss.
- Google Play bewertet sie eher als App statt als reinen Browser-Shortcut.
- Versionierbare Builds mit reproduzierbarer Web-Bundle-Version.
- Zugriff auf native Funktionen bleibt moeglich: Splash Screen, Deep Links, Push Notifications, sichere Speicherung.
Wichtige Anpassung:
- `VITE_API_BASE_URL`, `VITE_SOCKET_IO_URL`, `VITE_DAEMON_SOCKET` muessen fuer Android-Builds explizit auf die produktiven HTTPS/WSS-Endpunkte gesetzt werden.
- Relative API-URLs sind in einer gebuendelten Android-WebView riskant, weil `window.location.origin` nicht der Server-Origin ist.
### Phase 2: Mobile Web-Haertung
Die bestehende UI muss fuer kleine Viewports und Touch-Nutzung stabilisiert werden.
Prioritaeten:
- Login/Register/OAuth
- Hauptnavigation
- Falukant-Overview, Branch, Family, Bank
- Vokabeltrainer und Lessons
- Chat/Friends/Forum-Basics
- Minigames nur nach separater Touch-Performance-Pruefung
### Phase 3: Native Integrationen
Nach stabiler Shell koennen echte App-Features ergaenzt werden:
- Push Notifications fuer Chat, Freund-Login, Falukant-Events
- Deep Links fuer OAuth-Callbacks und geteilte Inhalte
- Android Back Button Integration
- Splash Screen und App Icons
- Secure Storage fuer Authdaten
- App Update / Version Check
### Phase 4: Selektiv native Screens
Wenn einzelne Bereiche Performance- oder UX-Probleme haben, koennen sie spaeter nativ ersetzt werden. Kandidaten:
- Login/Onboarding
- Push Notification Center
- Vokabeltrainer Session
- Falukant Status/Quick Actions
## Repository-Layout
Vorgeschlagenes Layout:
```text
android/
ANDROID_APP_PLAN.md
README.md
package.json
capacitor.config.ts
android/ # Capacitor Android-Projekt
scripts/
build-android-web.sh
sync-android.sh
```
Hinweis: In Phase 1 wird `/android/android` generiert, weil `/android` die Capacitor-Projektwurzel ist. Die generierten Android-Dateien werden versioniert, weil reproduzierbare Builds und native Anpassungen wichtig sind.
## Build-Konzept
### Android Web-Build
Ein eigener Build-Modus verhindert Vermischung mit Web-Production:
```bash
cd frontend
npm run build -- --mode android
```
Dafuer wird eine Datei `frontend/.env.android` benoetigt:
```env
VITE_API_BASE_URL=https://www.your-part.de
VITE_SOCKET_IO_URL=https://www.your-part.de
VITE_DAEMON_SOCKET=wss://www.your-part.de
VITE_PUBLIC_BASE_URL=https://www.your-part.de
```
Wichtig: `VITE_API_BASE_URL` ist bewusst nur die Origin ohne `/api`, weil die bestehenden Frontend-Aufrufe bereits Pfade wie `/api/auth/login` enthalten. Mit `/api` in der Base-URL entstehen Android-seitig falsche Requests wie `/api/api/...`.
Die exakten WebSocket-Pfade muessen gegen die produktive Apache-/Backend-Konfiguration verifiziert werden.
### Lokaler Emulator-Stand
Android Studio und mehrere AVDs sind lokal vorhanden. Fuer die ersten Stabilitaetstests ist `trainingstagebuchApi35` die bevorzugte VM, weil sie im bisherigen Test stabiler lief als das Play-Store-Image `Medium_Phone`.
```bash
ANDROID_AVD_HOME=/home/torsten/.config/.android/avd /home/torsten/Android/Sdk/emulator/emulator -avd trainingstagebuchApi35 -no-snapshot-save
adb install -r android/android/app/build/outputs/apk/debug/app-debug.apk
adb shell am start -W -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n de.yourpart.app/.MainActivity
```
Ergebnis bisher:
- Debug-APK wurde erfolgreich gebaut.
- APK wurde auf einem Emulator installiert.
- App startet als `de.yourpart.app/.MainActivity`.
- Login-Screen rendert mobil.
- API-Base-URL wurde von `/api` auf die Origin `https://www.your-part.de` korrigiert, damit keine `/api/api`-Requests entstehen.
- Capacitor `server.hostname` darf nicht auf `www.your-part.de` gesetzt werden, weil sonst echte Backend- und Model-URLs als lokale App-Assets behandelt werden.
- Nach Entfernung der Hostname-Kollision ist die Android-App-Origin `https://localhost`. Das Backend muss diese Origin in `CORS_ORIGINS` erlauben, sonst blockiert die WebView REST- und GLB-Requests.
### Capacitor Sync
Nach dem Frontend-Build:
```bash
cd android
npx cap sync android
```
Danach:
```bash
cd android
npx cap open android
```
Oder per CLI:
```bash
cd android
./gradlew assembleDebug
```
Lokaler Build-Hinweis:
- Auf diesem System liegt das Android SDK unter `/home/torsten/Android/Sdk`.
- Die lokale Datei `/android/android/local.properties` setzt `sdk.dir` darauf und ist absichtlich nicht versioniert.
- Erstes Debug-APK wurde erfolgreich gebaut: `/android/android/app/build/outputs/apk/debug/app-debug.apk`.
## Authentifizierung
### Bestehender Login
Der bestehende Login kann initial unveraendert bleiben:
- `POST /api/auth/login`
- Antwort enthaelt User inkl. `authCode`
- Axios haengt `userid` und `authcode` an Folgerequests
- Storage bleibt vorerst `localStorage`/`sessionStorage`
### Sicherheitsverbesserung
Phase 1 kann noch mit Web Storage starten. Vor Play-Store-Release sollte Auth aber in native sichere Speicherung verschoben werden:
- Capacitor Preferences nur fuer unkritische Werte
- Fuer sensible Werte besser Android Keystore ueber ein Secure-Storage-Plugin
- Migration: Store liest zuerst Secure Storage, fallback auf lokalen Web Storage, migriert dann
### OAuth
OAuth ist der groesste Integrationspunkt.
Kurzfristige Option:
- OAuth im In-App Browser oder externen Browser starten
- Callback bleibt auf `https://www.your-part.de/auth/oauth/callback`
- Die Callback-Seite tauscht `code/state` wie bisher gegen einen App-User
Bessere App-Option:
- Android App Links fuer `https://www.your-part.de/auth/oauth/callback`
- `assetlinks.json` auf der Domain bereitstellen
- Capacitor App Plugin verarbeitet den Deep Link und routet intern weiter
Risiko:
- OAuth Provider koennen eingebettete WebViews einschraenken. Deshalb sollte OAuth nicht in einer versteckten WebView erzwungen werden, sondern ueber Browser/App Links laufen.
## API und CORS
Fuer Capacitor-Bundles ist die Origin nicht immer identisch mit der Website-Origin.
Zu pruefen:
- Welche Origin sendet Android WebView bei Requests an `https://www.your-part.de/api`?
- Muss `CORS_ORIGINS` um `https://localhost` erweitert werden?
- Funktionieren Custom Header `userid` und `authcode` in der WebView?
- Funktionieren Preflight-Requests mit den bestehenden erlaubten Headers?
Noetige Backend-Konfiguration fuer Debug-Builds:
```env
CORS_ORIGINS=https://www.your-part.de,https://localhost,http://localhost:5173,http://127.0.0.1:5173
```
Nur nach Test setzen; nicht blind `CORS_ALLOW_ALL=1` fuer Produktion verwenden.
## Navigation und Deep Links
Die Vue-App nutzt `createWebHistory`. In Capacitor kann das funktionieren, aber folgende Punkte muessen getestet werden:
- Direktstart auf `/`
- Interne Navigation zu `/falukant/home`, `/friends`, `/socialnetwork/vocab/...`
- Android Back Button
- OAuth Callback URL
- App-Resume nach Browser-OAuth
Falls History-Mode Probleme in der WebView macht:
- Option A: Capacitor-spezifisch auf Hash-History wechseln
- Option B: History beibehalten und Deep-Link-Routing sauber behandeln
Hash-History waere technisch einfacher, aber wegen bestehender SEO-/Web-Routen nicht global fuer das Web-Frontend umstellen.
## Realtime
### Socket.IO
Bestehender Ablauf:
- Nach Login `initializeSocket`
- Socket verbindet zu `VITE_SOCKET_IO_URL`
- Client sendet `setUserId` mit `hashedId` oder `id`
Android-Testfaelle:
- Login erzeugt Socket-Verbindung
- App im Hintergrund trennt/reconnectet sauber
- Friend-Login-Events kommen an
- Schlechte Verbindung erzeugt keine Endlos-Fehlerdialoge
### Daemon-WebSocket
Falukant nutzt zusaetzliche Daemon-Events. Android muss mindestens diese Events empfangen koennen:
- `falukantUpdateFamily`
- `falukantUpdateStatus`
- `falukantUpdateProductionCertificate`
- `children_update`
- `falukantUpdateChurch`
- `falukantUpdateDebt`
Test:
- WSS ueber produktiven Proxy
- Reconnect nach App-Resume
- Filterung nach `user_id`
## Mobile UX Prioritaeten
Die App sollte nicht nur ein Desktop-Layout in einer WebView zeigen. Phase 1 braucht mindestens diese UX-Haertung:
- Header/Navigation auf kleinen Viewports pruefen
- Dialoge auf 360px Breite testen
- Tabellen und breite Falukant-Views horizontal oder responsiv absichern
- Touch-Ziele mindestens ca. 44px
- Keyboard-Verhalten im Login/Register testen
- Safe Area Insets fuer Statusbar/Navigationbar beachten
- Android Back Button: Dialog schliessen, sonst Router zurueck, sonst App minimieren
Aktueller Stand 2026-07-08:
- Hauptnavigation ist auf kleinen Viewports zu einer kompakten Menueleiste mit aufklappbarem, scrollbarem Menue umgebaut.
- Header ist auf Smartphone-Breite kompakter, Statusanzeigen laufen zweispaltig statt als lange Desktop-Leiste.
- Footer blendet leere System-/Fensterbereiche auf Smartphone-Breite aus und reserviert Safe-Area-Abstand nach unten.
- App-Shell nutzt `100dvh` als Android-WebView-freundlichere Viewport-Hoehe.
## Datenschutz, Content und Store-Risiken
Das Projekt enthaelt Social-, Chat-, Galerie-, Erotik-/Adult- und Moderationsbereiche. Fuer Play Store sind diese Punkte kritisch:
- Altersfreigabe und Adult-Content-Gating
- UGC-Moderation, Meldefunktion, Blockieren
- Datenschutzrichtlinie in der App und im Store Listing
- Account-Loeschung oder klare Anleitung
- Sichere Uebertragung nur per HTTPS/WSS
- Keine unsicheren Debug-Endpunkte im Release-Build
- Keine Secrets im Android-Bundle
Vor Play-Store-Release muss ein eigener Compliance-Check erfolgen.
## Teststrategie
### Lokale Tests
- Android Emulator mit Debug-Build
- Echtes Android-Geraet im gleichen Netz
- Produktions-API mit Testnutzer
- Offline/Online-Wechsel
- App Kill/Restart/Resume
### Kern-Testmatrix
- Login mit Username/Passwort
- Logout
- Registrierung
- Passwort vergessen
- OAuth Login je Provider, soweit konfiguriert
- Menu-Load nach Login
- Falukant Overview laden
- Falukant Realtime-Update empfangen
- Vokabeltrainer Lesson starten und abschliessen
- Chat verbinden und Nachricht empfangen
- Galerie/Bild-Upload, falls mobil zunaechst erlaubt
- Minigames Touch-Steuerung
- Admin-Bereiche entweder nutzbar oder bewusst ausgeblendet
### Build-Checks
- `npm run build` im Frontend
- Android Web-Build mit `.env.android`
- `npx cap sync android`
- `./gradlew assembleDebug`
- `./gradlew lint`
- Release-Build mit Signing-Konfiguration
## Verbleibende offene Punkte
- Produktivdomain final technisch testen: voraussichtlich `https://www.your-part.de`.
- Daemon-WebSocket-URL und Pfad final gegen Deploy-/Proxy-Konfiguration testen.
- Mindest-Android-Version aus Capacitor-Default uebernehmen und nach erstem Scaffold im Gradle-Projekt dokumentieren.
- Play-Store-Entscheidung bleibt nachgelagert bis Compliance-Pruefung abgeschlossen ist.
## TODO
### 1. Grundsatzentscheidungen
- [x] App-ID festlegen: `de.yourpart.app`.
- [x] App-Name und Launcher-Label festlegen: `YourPart`.
- [x] Ziel-Distribution festlegen: zuerst interne Debug-/Test-APK.
- [x] Entscheiden, ob Admin-Routen in der App sichtbar bleiben: nicht priorisiert, nicht aktiv entfernt.
- [x] Entscheiden, wie Adult-/Erotikbereiche in Android behandelt werden: bestehendes Web-Gating, kein Play Store ohne Compliance-Check.
- [x] Entscheiden, ob Backend Teil des Android-Starts ist: nein, nur Kompatibilitaetstests.
- [x] Entscheiden, ob Push Teil des ersten Scaffolds ist: nein.
- [x] Entscheiden, ob OAuth erster Blocker ist: nein, Username/Passwort-Login zuerst.
### 2. Android-Projekt scaffolden
- [x] In `/android` eigenes `package.json` anlegen.
- [x] Capacitor installieren: `@capacitor/core`, `@capacitor/cli`, `@capacitor/android`.
- [x] `capacitor.config.ts` mit App-ID `de.yourpart.app`, App-Name `YourPart` und `webDir` auf `../frontend/dist` konfigurieren.
- [x] Android-Plattform generieren: `npx cap add android`.
- [x] `/android/README.md` mit Build-Kommandos anlegen.
- [x] Entscheiden, ob generiertes `/android/android` versioniert wird: ja.
### 3. Frontend Android-Build
- [x] `frontend/.env.android.example` anlegen.
- [x] `VITE_API_BASE_URL` fuer Android explizit setzen.
- [x] `VITE_SOCKET_IO_URL` fuer Android explizit setzen.
- [x] `VITE_DAEMON_SOCKET` fuer Android explizit setzen.
- [x] Root- oder Android-Script fuer `build:android:web` ergaenzen.
- [x] Android-Web-Build mit produktiver Origin statt lokaler Dev-URL bauen.
- [ ] Release-Build-Gate ergaenzen, das lokale Dev-URLs automatisiert verhindert.
### 4. Backend-Kompatibilitaet
- [ ] Android-Origin im CORS-Verhalten messen.
- [x] Fehlerhafte Android-Request-Basis `/api/api` identifizieren und durch Origin-only-Config beheben.
- [x] Capacitor-Hostname-Kollision mit Backend-Host vermeiden; `server.hostname` bleibt Default.
- [x] `CORS_ORIGINS` fuer Capacitor als bestehenden Backend-Konfigurationspunkt notieren: `https://localhost`.
- [ ] Produktiv-/Testbackend mit `CORS_ORIGINS` inklusive `https://localhost` neu starten und Android-Requests erneut pruefen.
- [ ] Custom Header `userid`/`authcode` auf Android testen.
- [ ] Socket.IO-Verbindung von Android testen.
- [ ] Daemon-WebSocket ueber Android testen.
- [ ] Produktionsproxy fuer HTTPS/WSS pruefen.
- [ ] Keine Backend-Aenderung ohne konkreten fehlgeschlagenen Android-Test einplanen.
### 5. Auth und OAuth
- [ ] Username/Passwort-Login in Android testen.
- [ ] Persistenz nach App-Neustart testen.
- [ ] Logout inklusive Socket-Cleanup testen.
- [ ] OAuth-Login-Flow je Provider testen.
- [ ] Entscheiden: OAuth per externem Browser plus App Links oder innerhalb bestehender WebView.
- [ ] Android App Links einrichten, falls OAuth nativ zurueck in die App fuehren soll.
- [ ] Authdaten spaeter in Secure Storage migrieren.
### 6. Native App-Verhalten
- [ ] Android Back Button behandeln.
- [ ] Splash Screen konfigurieren.
- [ ] App Icons erzeugen.
- [ ] Statusbar/Safe-Area pruefen; aktueller Test zeigt nicht-blockierende Safe-Area-CSS-Console-Fehler.
- [x] WebView-Textfeld-Eingabe fuer Emulator reparieren: `android.captureInput` nicht aktivieren.
- [x] Android-Studio-Projektpfad dokumentieren: `/android/android`.
- [x] Android-Studio-Run-Configuration `YourPart Debug` anlegen.
- [ ] Deep-Link-Handling vorbereiten.
- [ ] App Resume/Pause Events fuer Socket-Reconnect nutzen.
### 7. Mobile UI-Haertung
- [ ] Login/Register auf 360px Breite testen.
- [x] Login-Screen im Emulator visuell pruefen.
- [x] Parameterlisten-Handling gegen Nicht-Array-Antworten haerten, damit Backend-Fehler keine UI-Exception ausloesen.
- [x] 3D-Modelle fuer Android-Debug per `VITE_DISABLE_3D=true` deaktivieren, damit Login/Onboarding stabil bleibt.
- [x] Hauptnavigation fuer kleine Viewports umbauen: kompakte Menueleiste plus scrollbares Menue statt voller Desktop-Navigation.
- [ ] Hauptnavigation mobil mit mehreren Rollen/Berechtigungssets testen.
- [ ] Dialoge auf kleinen Screens pruefen.
- [ ] Falukant-Views mit breiten Tabellen pruefen.
- [ ] Vokabeltrainer Touch- und Keyboard-Verhalten testen.
- [ ] Minigames separat auf Touch-Performance testen.
- [ ] Bild-/Dateiupload auf Android pruefen.
### 8. Push Notifications
- [ ] Entscheiden, ob Push in Phase 1 oder spaeter kommt.
- [ ] Event-Kandidaten definieren: Chat, Friend Login, Falukant, Vocab Reminder.
- [ ] Backend-Device-Token-Modell planen.
- [ ] FCM-Projekt konfigurieren.
- [ ] Opt-in und Settings-UI planen.
### 9. Store/Compliance
- [ ] Datenschutzseite in App erreichbar machen.
- [ ] Impressum in App erreichbar machen.
- [ ] Account-Loeschung/Anfrageprozess klaeren.
- [ ] Adult Content Policy pruefen.
- [ ] UGC-Moderation fuer Store Review dokumentieren.
- [ ] Release-Build ohne Debug-Konfiguration pruefen.
### 10. CI/CD
- [x] Android-Build-Script anlegen.
- [x] Debug-Build lokal reproduzierbar machen.
- [ ] Release-Signing-Konzept festlegen.
- [ ] Keystore sicher ausserhalb des Repos verwalten.
- [ ] Optional CI-Job fuer `frontend build` + `cap sync` + Gradle Build einrichten.
## Empfohlene erste Umsetzungsschritte
1. `/android` als Capacitor-Projekt initialisieren.
2. `frontend/.env.android.example` und Android-Build-Script anlegen.
3. Debug-APK mit produktiver Test-API bauen.
4. Login, Menu, Falukant Overview und Socket.IO testen.
5. Erst danach OAuth, Deep Links und Push angehen.
## Abnahmekriterien fuer Phase 1
- App installiert und startet auf Emulator und echtem Android-Geraet.
- Login/Logout funktionieren.
- Persistierter Login funktioniert nach App-Neustart.
- API-Requests senden `userid` und `authcode` korrekt.
- Socket.IO verbindet nach Login und reconnectet nach Resume.
- Mindestens Falukant Overview, Vokabeltrainer-Liste und Social/Friends laden.
- Android Back Button fuehrt nicht zu kaputten Zustanden.
- Build ist reproduzierbar dokumentiert.
Aktueller Stand:
- Android/Capacitor-Projekt ist erzeugt.
- Android-Web-Build ist erfolgreich.
- Capacitor Sync ist erfolgreich.
- Debug-APK-Build ist erfolgreich.
- Installation und Laufzeittests auf Emulator/Geraet stehen noch aus.

View File

@@ -1,58 +0,0 @@
# Android App Links und OAuth
## Verbindliche Domain
Die Produktions-App verwendet ausschließlich `https://www.your-part.de`.
Staging und lokale Builds öffnen diese URLs weiterhin im Browser und beanspruchen keine
Domain-Verknüpfung.
## Unterstützte Pfade
| Web-Pfad | Native Route | Anmeldung |
| --- | --- | --- |
| `/` | `home` | ja |
| `/socialnetwork/*` | Community, Suche, Galerie, Forum oder Vokabeln | ja |
| `/falukant/*` | `falukant` | ja |
| `/settings/*` | `settings` | ja |
| `/blogs/*` | `blogs` | nein |
| `/guides/*` | `guides` | nein |
| `/android/oauth/callback` | OAuth-Callback | nein |
Geschützte Links bleiben im Speicher erhalten. Nach erfolgreichem Login navigiert die App
automatisch zur ursprünglich angeforderten Route.
## OAuth
Die native App startet `/api/auth/oauth/{provider}/start?client=android` in einer Android
Custom Tab. Der Server erzeugt PKCE und `state`, speichert beides in Redis und nutzt als feste
Redirect-URI `https://www.your-part.de/android/oauth/callback`. Die App sendet nur `code`,
`state` und optional `iss` an `/api/auth/oauth/exchange`; Tokens von OAuth-Providern gelangen
nicht in die App.
In jedem aktivierten Provider muss diese URI als Redirect URI hinterlegt sein:
```text
https://www.your-part.de/android/oauth/callback
```
Optional kann das Backend die URL mittels `OAUTH_ANDROID_CALLBACK_URL` überschreiben. Der Wert
muss HTTPS verwenden und exakt den Pfad `/android/oauth/callback` haben.
## assetlinks.json
Nach Erzeugung des Release-Keystores den SHA-256-Fingerprint ermitteln:
```bash
keytool -list -v -keystore release.jks -alias <alias>
```
`frontend/public/.well-known/assetlinks.json.example` nach
`frontend/public/.well-known/assetlinks.json` kopieren, den Platzhalter durch den Fingerprint
ersetzen und mit dem Frontend ausliefern. Die finale Datei muss unter dieser URL ohne Redirect
und mit `Content-Type: application/json` abrufbar sein:
```text
https://www.your-part.de/.well-known/assetlinks.json
```
Erst dann kann Android `android:autoVerify` erfolgreich abschließen.

View File

@@ -1,869 +0,0 @@
# Native Android App Plan fuer YourPart3
Stand: 2026-07-08
## Zielbild
Dieses Dokument plant eine komplette native Android-App fuer YourPart3 als langfristige Ablösung bzw. Ergänzung der aktuellen Capacitor-Hybrid-App.
Ziel ist eine echte Android-App mit:
- Kotlin
- Jetpack Compose
- MVVM bzw. unidirektionalem UI-State
- Retrofit/OkHttp fuer REST
- Kotlinx Serialization oder Moshi fuer JSON
- Room/DataStore fuer lokale Persistenz
- Android Keystore fuer sensible Authdaten
- Socket.IO/WebSocket-Clients fuer Realtime
- Coil fuer Bilder
- WorkManager fuer Hintergrundjobs
- FCM fuer Push Notifications
Das vorhandene Backend bleibt die maßgebliche Datenquelle. Eine native Komplettumsetzung bedeutet deshalb nicht, das Backend neu zu schreiben, sondern die bestehende Web-App-Funktionalitaet systematisch in native Screens, native Navigation und robuste mobile Datenmodelle zu ueberfuehren.
## Grundentscheidung
- Die bestehende Hybrid-App bleibt als lauffaehige Zwischenloesung erhalten.
- Die native App wird parallel aufgebaut.
- Nicht als Big Bang migrieren. Stattdessen werden Modulgruppen nacheinander nativ umgesetzt und gegen produktionsnahe APIs getestet.
- Admin- und Adult-Bereiche werden nicht im ersten nativen MVP umgesetzt.
- Backend-Aenderungen sind nur erlaubt, wenn sie fuer stabile mobile API-Vertraege, Sicherheit, Push oder Datei-Uploads notwendig sind.
## Native Zielarchitektur
```text
android-native/
app/
core/
network/
auth/
database/
realtime/
design/
common/
feature-auth/
feature-home/
feature-social/
feature-chat/
feature-falukant/
feature-vocab/
feature-settings/
feature-media/
feature-minigames/
feature-admin/ # spaeter
```
Empfohlener Pfad im Repository:
- Entweder `/android/native` fuer die neue native App neben der Capacitor-App.
- Oder spaeter Migration von `/android/android` zu einem rein nativen Gradle-Projekt.
Empfehlung: `/android/native`, damit die Hybrid-App weiter testbar bleibt.
## Technische Zielentscheidungen
- Sprache: Kotlin.
- UI: Jetpack Compose, Material 3, eigene YourPart-Design-Tokens.
- Min SDK: aus Capacitor-Projekt/Play-Store-Ziel final ableiten, voraussichtlich Android 8+ oder Android 9+.
- Navigation: Compose Navigation mit typed Routes.
- Dependency Injection: Hilt.
- REST: Retrofit + OkHttp Interceptors.
- JSON: Kotlinx Serialization, falls Backend-Antworten stabil typisiert werden; sonst Moshi als toleranterer Start.
- Lokale Einstellungen: DataStore Preferences.
- Lokale Daten: Room fuer Cache, Entitaeten, Outbox.
- Auth-Geheimnisse: EncryptedSharedPreferences oder direkter Keystore-basierter Token Store.
- Bilder: Coil.
- Datei-Uploads: OkHttp Multipart, Android Photo Picker.
- Realtime: Socket.IO Android Client plus separater OkHttp WebSocket fuer Daemon.
- Push: Firebase Cloud Messaging.
- Tests: JUnit, Turbine, MockWebServer, Compose UI Tests.
## API-Strategie
Die Web-App nutzt aktuell viele direkte REST-Aufrufe aus Komponenten. Fuer native Android muss daraus ein klarer API-Client entstehen.
Native API-Schichten:
- `AuthApi`
- `SettingsApi`
- `MenuApi`
- `SocialApi`
- `GalleryApi`
- `ForumApi`
- `ChatApi`
- `FalukantApi`
- `VocabApi`
- `CalendarApi`
- `BlogGuideApi`
- `MinigamesApi`
- `AdminApi` spaeter
Wichtige Backend-Vertraege:
- Login liefert User inklusive `id` und `authCode`.
- REST-Requests brauchen Header `userid` und `authcode`.
- Socket.IO registriert User per `setUserId`.
- Daemon-WebSocket nutzt eigene Events und User-Kontext.
- Datei-/Bild-Endpunkte muessen Android Multipart und Android Content-URIs sauber unterstuetzen.
## Migrationsprinzip
Jedes Modul wird in vier Schritten umgesetzt:
1. API-Vertrag erfassen: Endpunkte, Payloads, Fehler, Rechte.
2. Domain-Modelle definieren: Kotlin DTOs, Mapping, UI-State.
3. Native Compose-UI bauen: kleine Screens, klare Loading/Error/Empty States.
4. Gegen Backend testen: Emulator, echtes Geraet, Offline/Resume, Realtime.
## MVP-Schnitt
Ein sinnvoller nativer MVP ist nicht "alles", sondern:
- Login/Logout
- Session-Persistenz
- Home/Dashboard
- native Navigation
- Settings: Sprache und Account-Basis
- Friends/Search/Profile light
- Chat light
- Falukant Overview + Status + Branch-Liste light
- Vokabeltrainer Course/Lesson light
- Push-Grundlage optional
Alles Weitere wird danach iterativ migriert.
## Nicht-Ziele fuer den nativen MVP
- Kein vollstaendiger Admin-Bereich.
- Keine vollstaendige Falukant-Wirtschaftssimulation in Version 1.
- Keine nativen Minigames in Version 1, ausser als separate Spike-/Proof-of-Concepts.
- Keine 3D-Charakterdarstellung in Version 1.
- Keine Offline-First-Synchronisation fuer alle Module.
- Keine Store-Verteilung vor Datenschutz-/UGC-/Adult-Compliance.
## Risiken
- Sehr breite Web-App-Funktionalitaet: ein nativer Rewrite ist ein Mehrmonatsthema, nicht ein Scaffold-Thema.
- API-Vertraege sind aktuell komponentennah, nicht als Mobile API versioniert.
- Auth nutzt `userid`/`authcode` statt standardisiertem Bearer Token.
- Viele Screens erwarten Web-Layout, Dialoge und dynamische Menues.
- Falukant ist daten- und realtime-intensiv.
- Chat, Galerie, Adult Content und UGC erfordern Store-Compliance.
- Native 3D/Minigames brauchen eigene Performance-Entscheidungen.
## Abhakbare Roadmap
### 0. Projektentscheidung und Scope
Entscheidungen:
- Native App wird unter `/android/native` aufgebaut.
- Die bestehende Capacitor-App bleibt parallel erhalten, bis die native App mindestens den MVP stabil abdeckt.
- Der native MVP ist kein vollstaendiger Rewrite, sondern ein lauffaehiger nativer Kern: Auth, App-Shell, Home, Settings light, Social light, Chat light, Falukant light, Vokabeltrainer light.
- Admin wird aus dem nativen MVP ausgeschlossen.
- Adult-/Erotikbereiche werden aus dem nativen MVP ausgeschlossen und nur spaeter mit separater Compliance-Entscheidung umgesetzt.
- Minigames werden aus dem nativen MVP ausgeschlossen und spaeter als eigener Performance-/Touch-Spike bewertet.
- 3D-Charaktere werden aus dem nativen MVP ausgeschlossen und spaeter als eigener Rendering-Spike bewertet.
- Zielgeraete fuer MVP: kleine Phones ab 360dp Breite, normale Phones, spaeter Tablet-Layouts ab 600dp.
- Mindest-Android fuer MVP: Android 8.0 / API 26, sofern Dependencies und Testgeraete keine hoehere Grenze erzwingen.
- Distribution fuer MVP: interne Debug-/Test-APK. Play Store bleibt nachgelagert bis Compliance, Signing, Datenschutz und Store-Review vorbereitet sind.
Todo:
- [x] Entscheiden, ob die native App unter `/android/native` angelegt wird.
- [x] Entscheiden, ob die Capacitor-App langfristig parallel gepflegt bleibt.
- [x] Native MVP-Funktionsumfang final freigeben.
- [x] Admin-Bereich aus MVP ausschliessen oder explizit aufnehmen.
- [x] Adult-/Erotikbereiche aus MVP ausschliessen oder explizit mit Compliance-Aufwand aufnehmen.
- [x] Minigames aus MVP ausschliessen oder als separaten Spike aufnehmen.
- [x] 3D-Charaktere aus MVP ausschliessen oder als separaten Spike aufnehmen.
- [x] Zielgeraete festlegen: kleine Phones, Tablets, Mindest-Android-Version.
- [x] Play-Store-Zieltermin oder interne Distribution als Ziel definieren.
### 1. Native Projektbasis
Stand 2026-07-09:
- Native Projektbasis ist unter `/android/native` angelegt.
- Gradle Kotlin DSL ist aktiv.
- Separate Native-App-ID ist bewusst gewaehlt: `de.yourpart.nativeapp` mit Flavor-/Build-Type-Suffixen fuer parallele Installation.
- Flavors `local`, `staging`, `production` sind angelegt.
- Build Types `debug`, `release` sind angelegt.
- Versionierung ist initial definiert: `versionCode`, `versionName`, `BuildConfig.GIT_SHA`.
- Compose, Material 3, Hilt, Retrofit/OkHttp, Kotlinx Serialization JSON, Room, DataStore, Coil, WorkManager und FCM-Dependency sind im Projekt hinterlegt.
- Ein reproduzierbarer lokaler Build laeuft erfolgreich: `:app:assembleLocalDebug`.
- [x] Neues natives Gradle-Projekt unter `/android/native` erstellen.
- [x] Kotlin DSL fuer Gradle verwenden.
- [x] App-ID `de.yourpart.app` oder separate Dev-ID `de.yourpart.native.dev` entscheiden.
- [x] Produktflavors anlegen: `local`, `staging`, `production`.
- [x] Build Types anlegen: `debug`, `release`.
- [x] Versionierung definieren: `versionCode`, `versionName`, Git-Hash im Build.
- [x] Compose aktivieren.
- [x] Material 3 aktivieren.
- [x] Hilt einrichten.
- [x] Retrofit/OkHttp einrichten.
- [x] JSON-Library festlegen und einrichten.
- [x] Room einrichten.
- [x] DataStore einrichten.
- [x] Coil einrichten.
- [x] WorkManager einrichten.
- [x] FCM Dependency vorbereiten, aber noch nicht aktiv schalten.
- [x] Lint, Detekt oder Ktlint einrichten.
- [x] CI-Build-Script fuer native App definieren.
### 2. Design System
Stand 2026-07-09:
- Die Web-Farbpalette ist in native Tokens uebertragen.
- Typography, Spacing und Shapes sind als Theme-Tokens angelegt.
- Wiederverwendbare Compose-Bausteine existieren fuer Buttons, Textfelder, Dialoge, Info-/Loading-/Empty-States, Avatar und Status-Chips.
- Das Light Theme ist aktiv und die Demo-Shell nutzt die neuen Komponenten bereits.
- Ein minimales Dark-Theme-Grundgeruest existiert technisch, die Produktentscheidung dafuer bleibt aber offen.
- [x] YourPart-Farbpalette aus Web-App ableiten.
- [x] Typography fuer Android definieren.
- [x] Spacing-Skala definieren.
- [x] Shape-/Radius-System definieren.
- [x] Button-Komponenten definieren.
- [x] TextField-Komponenten definieren.
- [x] Dialog-Komponenten definieren.
- [x] Error-/Info-/Success-Komponenten definieren.
- [x] Loading/Empty-State-Komponenten definieren.
- [x] Avatar-/Image-Komponenten definieren.
- [x] Status-Chips fuer Backend/Daemon definieren.
- [x] Light Theme implementieren.
- [x] Dark Theme bewusst entscheiden: nein, nicht Teil des MVP.
- [x] Kleine Displaybreiten 360dp und 393dp als Design-Baseline testen: nein, nicht Teil des MVP.
### 3. App Shell und Navigation
Stand 2026-07-09:
- Die Demo-App ist zu einer nativen Shell mit Navigation ausgebaut.
- Top App Bar, Bottom Navigation und Drawer existieren.
- Primaere und sekundaere Bereiche sind als Route-Objekte modelliert.
- Eine erste Menue-Policy auf Basis von Session/Rollen ist vorhanden.
- Drawer-Back-Handling und Session-expired Rueckfuehrung zur Auth-Route sind umgesetzt.
- Offline-Banner sowie kompakte Backend-/Daemon-Status-Chips sind sichtbar.
- [x] Root Compose App mit Theme erstellen.
- [x] Top App Bar definieren.
- [x] Bottom Navigation fuer Hauptbereiche definieren.
- [x] Navigation Drawer fuer Sekundaerbereiche definieren.
- [x] Typed Routes fuer Auth, Home, Social, Falukant, Vocab, Settings anlegen.
- [x] Rollen-/Rechte-basierte Menueeintraege modellieren.
- [x] Backend-Menue-Response analysieren und native Menue-Policy definieren.
- [x] Android Back Button Verhalten definieren.
- [x] Dialog-Back-Handling implementieren.
- [x] Session-expired Navigation implementieren.
- [x] Offline-Banner implementieren.
- [x] Backend-/Daemon-Status sichtbar, aber kompakt darstellen.
### 4. Konfiguration und Environments
Stand 2026-07-09:
- Flavor-spezifische URLs fuer `local`, `staging`, `production` sind im Build hinterlegt.
- `local` nutzt bewusst `10.0.2.2` fuer Emulator-Zugriff.
- Release-Builds validieren automatisch, dass `staging` und `production` keine lokalen oder unverschluesselten URLs verwenden.
- Debug und Release nutzen getrennte Network-Security-Configs.
- Release verbietet Cleartext komplett.
- Feature Flags fuer `Admin`, `Adult`, `3D`, `Minigames` und `Push` sind als BuildConfig-Felder angelegt.
- Eine zentrale `AppConfig` liest die Flavor-/Build-Konfiguration aus `BuildConfig`.
- [x] API Base URLs fuer `local`, `staging`, `production` definieren.
- [x] Socket.IO URLs je Flavor definieren.
- [x] Daemon WebSocket URLs je Flavor definieren.
- [x] Lokale Emulator-Regel dokumentieren: Host-Rechner ist `10.0.2.2`.
- [x] Release-Build gegen lokale URLs blockieren.
- [x] Network Security Config fuer Debug und Release definieren.
- [x] TLS-only fuer Release sicherstellen.
- [x] Secrets aus APK fernhalten.
- [x] Feature Flags definieren: Admin, Adult, 3D, Minigames, Push.
### 5. Auth und Session
Stand 2026-07-09:
- Login, Logout und Session-Persistenz sind nativ angebunden.
- REST-Requests setzen automatisch `userid` und `authcode`.
- 401-Antworten fuehren zu Session-Loeschung und Session-expired-Hinweis.
- Registrierung, Passwort-Reset und OAuth-Provider-Liste sind als native Auth-Bausteine vorhanden.
- [x] Login-Endpunkt dokumentieren.
- [x] Login DTOs erstellen.
- [x] Login Repository implementieren.
- [x] Auth Interceptor fuer `userid` und `authcode` implementieren.
- [x] Session Store mit sicherer Speicherung implementieren.
- [x] Auto-Login beim App-Start implementieren.
- [x] Logout implementieren.
- [x] Session-expired Handling implementieren.
- [x] User-Aktivstatus pruefen.
- [x] Account gesperrt Handling implementieren.
- [x] Registrierung API-Vertrag erfassen.
- [x] Registrierung Screen implementieren.
- [ ] Account-Aktivierung Flow bewerten.
- [x] Passwort-Reset Flow implementieren.
- [x] OAuth-Provider-Liste laden.
- [ ] OAuth per Custom Tabs planen.
- [ ] App Links fuer OAuth Callback planen.
- [ ] OAuth erst nach Username/Passwort stabil aktivieren.
### 6. Netzwerk-Grundlage
Stand 2026-07-09:
- Eine zentrale `ApiResult`/`NetworkError`-Basis ist angelegt.
- Backend-Fehler werden zentral geparst und in lesbare Meldungen ueberfuehrt.
- Timeout- und Retry-Policy sind als feste Netzwerk-Defaults definiert.
- Debug-Logging laeuft nur ausserhalb von Release.
- Multipart- und Download-Helfer sind vorhanden.
- Ein MockWebServer-Test prueft den Auth-Header-Interceptor.
- Ein zentraler `NetworkRequestExecutor` fasst OkHttp-Fehlerbehandlung fuer Repository-Aufrufe zusammen.
- [x] Zentrale `ApiResult`/`NetworkError` Struktur definieren.
- [x] Fehlercodes und Backend-Fehlerformate erfassen.
- [x] Retry-Policy definieren.
- [x] Timeout-Policy definieren.
- [x] Request Logging nur fuer Debug aktivieren.
- [x] Auth Header Tests mit MockWebServer schreiben.
- [x] CORS ist nativ irrelevant, aber Backend-Origin-Checks gegen mobile Clients pruefen.
- [x] Multipart Upload Helper bauen.
- [x] Download Helper fuer Bilder/Dateien bauen.
- [x] Pagination Pattern definieren.
- [x] Refresh Pattern definieren.
### 7. Lokale Persistenz und Cache
Stand 2026-07-09:
- Ein zentraler Preferences-Store fuer UI-Sprache und Feature-Flags ist angelegt.
- Eine Room-Cache-Basis mit ersten Tabellen fuer Profil, Friends-Search, Falukant-Status und Vokabeldaten ist definiert.
- Cache-TTLs und Invalidierungsregeln sind als feste Policy hinterlegt.
- Die MVP-Entscheidung lautet: Offline-Anzeige statt Offline-First.
- Outbox/Offline-Write-Queues werden im MVP nur geplant, nicht erzwungen.
- [x] DataStore fuer UI-Sprache verwenden.
- [x] DataStore fuer Feature Flags verwenden.
- [x] Room Schema fuer User/Profile Cache definieren.
- [x] Room Schema fuer Friends/Search Cache definieren.
- [x] Room Schema fuer Falukant Status light definieren.
- [x] Room Schema fuer Vocab Course/Lesson Cache definieren.
- [x] Cache-Invalidation Regeln definieren.
- [x] Offline-Anzeige statt Offline-First fuer MVP festlegen.
- [x] Outbox fuer spaetere Offline-Aktionen nur planen, nicht im MVP erzwingen.
### 8. Realtime
Stand 2026-07-09:
- Socket.IO ist als Backend-Realtime-Transport in die native App eingebunden.
- Der Client sendet nach Login automatisch `setUserId` an Backend und Daemon.
- App-Foreground/Background koppelt die Verbindung an den Lifecycle.
- Backend- und Daemon-Status sind in der Shell sichtbar.
- Der Daemon-WebSocket-Client ist technisch angebunden.
- Realtime-Event-Basis und Daemon-Message-Parser sind vorhanden.
- Realtime-Events invalidieren nun gezielt Cache-/UI-Zustaende und erscheinen im internen Debug-Screen.
- [x] Socket.IO Android Client evaluieren.
- [x] Verbindung nach Login aufbauen.
- [x] `setUserId` nach Verbindungsaufbau senden.
- [x] Events erfassen: `forumschanged`, `friendloginchanged`, `reloadmenu`, `adultVerificationChanged`, `moderationReportChanged`, `userAccessChanged`.
- [x] Falukant-Events erfassen: `falukantUpdateStatus`, `falukantUpdateFamily`, `falukantUpdateChurch`, `falukantUpdateDebt`, `children_update`, `falukantUpdateProductionCertificate`, `falukantBranchUpdate`, `stock_change`, `familychanged`.
- [x] Socket Lifecycle an App Foreground/Background koppeln.
- [x] Reconnect Policy definieren.
- [x] Daemon-WebSocket Client implementieren.
- [x] Daemon-Message Parsing robust gegen unbekannte Events machen.
- [x] Realtime Events in Repositories einspeisen.
- [x] UI-State bei Events gezielt invalidieren.
- [x] Realtime Debug Screen fuer interne Builds planen.
### 9. Home und Dashboard
Stand 2026-07-09:
- Die nicht eingeloggte Startseite ist als native Landing/Auth-Kombination umgesetzt.
- Die eingeloggte Startseite laedt Dashboard-Daten aus dem Backend und zeigt Karten fuer Termine, Geburtstage, Falukant und Vokabeln.
- Dashboard-Widget- und Kalender-Widget-Vertraege sind nativ angebunden.
- Backend-/Daemon-Status bleibt als kompakte Info sichtbar.
- [x] Home API-Vertraege erfassen.
- [x] Eingeloggt/Nicht-eingeloggt Home getrennt modellieren.
- [x] Native Startseite fuer nicht eingeloggte Nutzer bauen.
- [x] Native Startseite fuer eingeloggte Nutzer bauen.
- [x] Dashboard Widget API-Vertraege erfassen.
- [x] Termine/Upcoming Events als native Cards umsetzen.
- [x] Falukant Kurzstatus als native Card umsetzen.
- [x] Backend-/Daemon-Status light anzeigen.
### 10. Settings
- [x] Settings API-Vertraege erfassen: `/api/settings/filter`, `/api/settings/update`, `/api/settings/account`, `/api/settings/set-account`, `/api/settings/visibilities`.
- [x] Spracheinstellung nativ implementieren.
- [x] Account-Basisdaten nativ implementieren.
- [x] Sichtbarkeitseinstellungen modellieren.
- [x] Personal/View/Sexuality/Flirt Settings priorisieren.
- [x] Interessen-Settings implementieren.
- [x] Language Assistant Settings bewerten.
- [x] Account-Loeschung oder Anfrageprozess fuer Store-Compliance klaeren.
### 11. Social Basis
- Stand 2026-07-09:
- Friends, Benutzersuche, Profil-Light und Gästebuch-Light sind nativ angebunden.
- Freundschaftsaktionen laufen in der nativen Friends-Ansicht gegen die vorhandenen Backend-APIs.
- Profilfelder werden inklusive Backend-Visibility-Regeln angezeigt.
- Moderationsmeldungen fuer Profile und Gästebucheintraege sind in der nativen UX integriert.
- [x] Friends API-Vertraege erfassen.
- [x] Friends Screen implementieren: bestehend, angefragt, offen, abgelehnt.
- [x] User Search API-Vertraege erfassen.
- [x] User Search Screen implementieren.
- [x] User Profile API-Vertraege erfassen.
- [x] Profile Light Screen implementieren.
- [x] Guestbook API-Vertraege erfassen.
- [x] Guestbook light implementieren.
- [x] Friend Request Aktionen implementieren.
- [x] Blockieren/Melden UX fuer Store-Compliance planen.
- [x] Privacy/Visibility Regeln aus Backend nativ abbilden.
### 12. Chat
Stand 2026-07-09:
- Der nativen MVP-Schnitt fuer Chat ist begonnen.
- Öffentliche Räume, eigene Räume, ein einfacher 1:1-Verlauf und Random Chat sind nativ angebunden.
- Direktnachrichten, Random Chat und die Raumlisten werden per Polling aktualisiert, bis die Socket.IO-Paritaet fuer den Chat folgt.
- Die MultiChat-Raumübersicht ist nativ verfuegbar; die historischen Socket.IO-Kommandos fuer den alten MultiChat bleiben als separate Paritaetsaufgabe offen.
- Direktnachrichten koennen gesendet und gemeldet werden.
- Push-Kandidaten fuer Chat sind identifiziert: Direktchat, Random-Chat, Raumbeitritt, Moderationsmeldungen.
- Socket.IO-Paritaet fuer Chat ist ein Pflichtpunkt und muss vor dem nativen Chat-Full-Release abgeschlossen werden.
- [x] Aktuellen Chat-Mechanismus erfassen: Dialoge, Raeume, Random Chat, MultiChat.
- [x] Chat Backend-/WebSocket-Vertraege dokumentieren.
- [x] Chat Room Liste implementieren.
- [x] 1:1 Chat MVP implementieren.
- [x] MultiChat MVP implementieren oder bewusst verschieben.
- [x] RandomChat bewusst verschieben oder implementieren.
- [x] Message Input mit Keyboard-Verhalten testen.
- [x] Neue Nachrichten per Realtime anzeigen.
- [x] Push-Kandidaten fuer Chat definieren.
- [x] Melden/Blockieren im Chat implementieren oder als Release-Blocker markieren.
- [ ] Socket.IO-Paritaet fuer Chat vollstaendig nativ umsetzen: Room-Join, Room-Events, Direktchat-Events, Random-Events und User-Registrierung ohne Polling.
### 13. Galerie und Medien
Stand 2026-07-10:
- Die Galerie wird als nativer Social-Unterbereich aufgebaut.
- Folder-Struktur, Bildliste, Sichtbarkeiten und Upload sind im nativen MVP bereits angelegt.
- Adult-Galerie und Video-Unterstuetzung bleiben bewusst aus dem ersten nativen Galerie-MVP heraus.
- [x] Galerie API-Vertraege erfassen.
- [x] Folder-Struktur nativ modellieren.
- [x] Bildliste mit Coil implementieren.
- [x] Bilddetail mit Vorschau sowie nativer Metadatenpflege fuer Titel und Sichtbarkeit implementieren.
- [x] Android Photo Picker fuer Upload implementieren.
- [x] Multipart Upload gegen den Backend-Vertrag automatisiert testen.
- [x] Bildbearbeitung aus Web-App bewerten: MVP nein. Die Web-Galerie bearbeitet nur Metadaten; Pixelbearbeitung, Crop und Filter bleiben aus dem nativen MVP ausgeschlossen.
- [x] Sichtbarkeiten laden und setzen.
- [x] Adult-Galerie aus MVP ausschliessen oder Compliance-Aufwand planen.
- [x] Video-Unterstuetzung separat planen.
### 14. Forum
Stand 2026-07-10:
- Forum, Themenliste und Themenansicht sind nativ als Social-Unterbereich umgesetzt.
- Beiträge werden nativ als Klartext gerendert; die bestehende HTML-Eingabe wird nicht ausgeführt.
- `forumschanged`, `topicschanged` und `messageschanged` aktualisieren alle offenen Forum-Ansichten gezielt.
- [x] Forum-Liste API-Vertrag erfassen.
- [x] Topic-Liste API-Vertrag erfassen.
- [x] Topic-Detail API-Vertrag erfassen.
- [x] Forum-Liste native umsetzen.
- [x] Topic-Liste native umsetzen.
- [x] Topic-Detail native umsetzen.
- [x] Antwort erstellen implementieren.
- [x] Moderation Report fuer Forum implementieren.
- [x] Realtime `forumschanged` integrieren.
### 15. Falukant MVP
Stand 2026-07-10:
- Der native Falukant-MVP ist eine Read-only-Spielstandszentrale: Übersicht, Status, Filialen, Bank, Familie und Nachrichten.
- Die Datenmodelle sind auf die bestehenden, je Spielstand unterschiedlich umfangreichen Backend-Antworten ausgelegt und ignorieren zusätzliche Felder.
- Create wird bewusst verschoben: Der bestehende Flow hängt an Charakter-, Namen- und 3D-Entscheidungen, die nicht Teil des MVP sind.
- [x] Falukant API-Endpunkte aus Web-App inventarisieren.
- [x] `StatusBar` Datenmodell nativ definieren.
- [x] Overview Screen implementieren.
- [x] Character/Familien-Basisdaten implementieren.
- [x] Branch-Liste implementieren.
- [x] Branch-Detail light implementieren.
- [x] Bank light implementieren.
- [x] Messages/Notifications light implementieren.
- [x] Realtime Falukant Events integrieren.
- [x] Create Falukant Flow bewusst verschieben.
- [x] Family View light implementieren.
- [x] Church/Reputation/Health/Nobility als Falukant-Vollausbau markieren.
- [x] Production/Storage/Sale/Director als Falukant-Vollausbau markieren.
- [x] Karten-/Regionen-Features als Falukant-Vollausbau markieren.
### 16. Falukant Vollausbau
Stand 2026-07-10:
- Der Wirtschaftsblock ist begonnen: Filialdetails laden Produktion, Lager, Inventar, Director, Fahrzeuge und laufende Transporte.
- Bereits native Kernaktionen: Produktion starten, Lager kaufen, Einzel- und Komplettverkauf, Fahrzeuge gesammelt reparieren, Director-Einkommen speichern, Transport starten und Kredit aufnehmen.
- Die verbliebenen Punkte werden erst abgehakt, sobald ihre jeweiligen Detail- und Aktionsflows nativ abgeschlossen sind.
#### 16.1 Filiale und Wirtschaft
- [x] Filialdetail-Basis laden: Filiale, Produktion, Lager, Inventar, Director, Fahrzeuge und Transporte.
- [x] Produktion starten implementieren.
- [x] Lagerkapazität kaufen implementieren.
- [x] Einzelverkauf implementieren.
- [x] Gesamtes Inventar verkaufen implementieren.
- [x] Fahrzeuge gesammelt reparieren implementieren.
- [x] Director-Einkommen speichern implementieren.
- [x] Transport starten implementieren.
- [x] Branch Detail vollstaendig umsetzen: Upgrade, Steuerübersicht, Preisvergleich und Detaildarstellung vervollständigen.
- [x] Production Section vervollständigen: laufende Produktionen, Restzeit, Qualitäts-/Wetterdaten und Abbruchregeln.
- [x] Storage Section vervollständigen: Kapazität je Typ verkaufen und verfügbare Lagertypen auswählen.
- [x] Sale Section vervollständigen: Inventarpositionen auswählen, regionale Preise vergleichen und Verkauf bestätigen.
- [x] Director Info vervollständigen: Proposal, Einstellung, Wissens-/Lehrfluss und alle Einstellungen.
- [x] Transport Routes vervollständigen: Routen-Vorschau, Kapazitätsprüfung, Wachkosten und Transportstatus.
#### 16.2 Bank und Historie
- [x] Bankübersicht und aktive Kredite laden.
- [x] Kreditaufnahme implementieren.
- [x] Bank vollstaendig umsetzen: Tilgung, Gebührenvorschau, Sperren und Schuldgefängnis-Aktionen.
- [x] Money History umsetzen: Filter, Pagination und Graphdaten.
#### 16.3 Familie und Person
- [x] Family vollstaendig umsetzen: Partnerschaft, Geschenke, Erben, Kinder und Liebesbeziehungen.
- [x] Health umsetzen: Gesundheitsstatus und Aktivitäten mit Cooldown.
- [x] Reputation umsetzen: Aktionen, Partys und Fortschritt.
- [x] Church umsetzen: Taufe, Ämter, Bewerbungen und Entscheidungen.
- [x] Nobility umsetzen: Stand, Voraussetzungen und Aufstieg.
- [x] House umsetzen: Hauskauf, Renovierung, Personal und Haushaltsordnung.
- [x] Education umsetzen: Lernende, Inhalte und Schulaktionen.
#### 16.4 Gesellschaft und Konflikt
- [x] Politics umsetzen: Übersicht, Ämter, Steuern, Ernennungen, Wahlen und Kandidaturen.
- [x] Underground umsetzen: Aktivitäten, Ziele, Angriffe und Raid-Regionen.
#### 16.5 Qualität
- [x] Performance fuer grosse Falukant-Datenmengen testen.
### 17. Vokabeltrainer MVP
- [x] Vocab Languages API-Vertrag erfassen.
- [x] Course List API-Vertrag erfassen.
- [x] Course Detail API-Vertrag erfassen.
- [x] Lesson API-Vertrag erfassen.
- [x] Review API-Vertrag erfassen.
- [x] Vocab Landing native umsetzen.
- [x] Course List native umsetzen.
- [x] Course Detail native umsetzen.
- [x] Lesson Player MVP implementieren.
- [x] Lesson Review implementieren.
- [x] Dictionary light implementieren.
- [x] Progress/Completion speichern.
- [x] Keyboard-/Audio-/Touch-Verhalten testen.
- [x] Offline Cache fuer aktive Lektion planen: aktive Lektion und Antworten werden erst in Abschnitt 18 per Room synchronisiert.
### 18. Vokabeltrainer Vollausbau
- [x] Neue Sprache anlegen implementieren.
- [x] Subscribe Flow implementieren.
- [x] Chapter View implementieren.
- [x] Dictionary vollstaendig implementieren.
- [x] Practice Dialog nativ ersetzen.
- [x] SRS-/Review-Logik gegen Backend validieren.
- [x] Offline Lesson Cache implementieren.
- [x] Sync-Konflikte definieren.
Konfliktregel: Der vom Server geladene Lektionsstand ist verbindlich. Nicht bestaetigte
SRS-Reviews bleiben mit einer lokalen Request-ID in der Outbox und werden in Reihenfolge
erneut gesendet; nach einer Server-Antwort wird der Eintrag entfernt.
### 19. Kalender und Persoenliches
- [x] Calendar API-Vertraege erfassen.
- [x] Monats-/Wochen-/Listenansicht entscheiden.
- [x] Termine laden.
- [x] Termin erstellen.
- [x] Termin bearbeiten.
- [x] Termin loeschen.
- [x] Date/Time Picker nativ einsetzen.
- [x] Reminder/Push spaeter planen.
- [x] Diary API-Vertrag erfassen.
- [x] Diary light umsetzen oder verschieben.
Entscheidung: Die mobile Umsetzung verwendet eine nach Datum sortierte Listenansicht mit
Monatsbereich. Termine nutzen `/api/calendar/events` (GET mit Datumsbereich, POST, PUT,
DELETE). Das Diary nutzt `/api/socialnetwork/diary` mit paginierter Liste und CRUD. Lokale
Reminder und Push-Benachrichtigungen werden erst nach der Push-Grundlage aus Abschnitt 12
als WorkManager-Aufgabe mit Android-Notification-Kanal umgesetzt.
### 20. Public Content
- [x] Blog List API-Vertrag erfassen.
- [x] Blog Detail API-Vertrag erfassen.
- [x] Guide List API-Vertrag erfassen.
- [x] Guide Detail API-Vertrag erfassen.
- [x] Public Landing Screens nativ priorisieren oder aus App entfernen.
- [x] Rich Text Rendering nativ loesen.
- [x] Blog Editor aus MVP ausschliessen.
- [x] Guide/Marketing Content als WebView-Fallback pruefen oder nativ rendern.
- [x] News/Blog/Guide Kurzlisten bewerten.
Entscheidung: Öffentliche Blogs nutzen `/api/blog/blogs` und `/api/blog/blogs/:id/posts`.
Ratgeber haben keinen Backend-Vertrag, sondern stammen aus dem versionierten Frontend-Katalog;
die mobile App führt dafür einen kuratierten, nativ gerenderten Lesekatalog. HTML aus
Blogbeiträgen wird als sicherer Text ohne WebView gerendert. Der Blog-Editor bleibt im Web.
News verwendet einen authentifizierungspflichtigen Drittanbieter-Proxy und wird nicht als
öffentliche Kurzliste dupliziert; Blogs und Ratgeber bleiben Drawer-Bereiche.
### 21. Minigames
#### 21.1 Match3
- [x] Match3 Game als native Compose/Canvas Machbarkeit pruefen.
- [x] Spielbrett, Tile-Modell und Zuglogik definieren.
- [x] Touch-Steuerung fuer Auswahl und Tausch definieren.
- [x] Animationen und Aufloesung von Matches definieren.
- [x] Score-/Leaderboard-API-Vertraege fuer Match3 erfassen.
- [ ] Performance auf Emulator und echtem Geraet testen. In eine spaetere gemeinsame QA-Runde verschoben.
Entscheidung: Match3 wird als natives Compose-Canvas-Spiel mit einem 8x8-Board umgesetzt.
Ein Zug besteht aus zwei Tap-Eingaben auf benachbarte Steine. Matches werden gesammelt,
aufgeloest, von oben aufgefuellt und mit 10 Punkten pro Stein bewertet. Der Fortschritt nutzt
`/api/match3/campaigns`, das erste aktive Level und den vorhandenen Progress-Endpunkt samt
Hash-Format. Admin-Routen bleiben ausgeschlossen.
#### 21.2 Taxi
- [x] Taxi Game als native Canvas/OpenGL Machbarkeit pruefen.
- [x] Spielfeld, Fahrzeugzustand und Fahrphysik definieren.
- [x] Touch-Steuerung fuer Lenken, Beschleunigen und Bremsen definieren.
- [x] Auftrags-, Ziel- und Kollisionslogik definieren.
- [x] Score-/Leaderboard-API-Vertraege fuer Taxi erfassen.
- [ ] Performance auf Emulator und echtem Geraet testen. In eine spaetere gemeinsame QA-Runde verschoben.
Entscheidung: Taxi wird als natives Compose-Canvas-Spiel umgesetzt. Vier Touch-Schaltflächen
steuern Lenken, Beschleunigen und Bremsen. Ein gelber Abholpunkt und ein grünes Ziel bilden
einen Auftrag; Verkehr erzeugt Kollisionen, drei Kollisionen oder leerer Tank beenden die
Fahrt. Highscores nutzen `/api/taxi/highscores` mit Benutzer-ID, Punkten, Fahrgästen,
Spielzeit und Kartenkennung. OpenGL ist für diese 2D-Strecke nicht erforderlich.
#### 21.3 Gemeinsame Integration
- [x] WebView-Fallback fuer Minigames als Zwischenloesung bewerten.
- [x] Gemeinsame Minigame-Navigation und Lifecycle-Verhalten definieren.
- [x] Gemeinsames Persistenz- und Abbruchverhalten definieren.
- [x] Admin-Tools fuer Minigames aus nativer App ausschliessen.
Entscheidung: Es gibt keinen WebView-Fallback. Match3 und Taxi bleiben native Canvas-
Implementierungen; der vorhandene Webbereich wird nicht in die native App eingebettet. Der
Drawer zeigt bei aktiviertem `FEATURE_MINIGAMES` nur den geschuetzten Hub `minigames`; von dort
sind die beiden geschuetzten Spielrouten erreichbar. Spielschleifen sind an die Composition
gebunden und werden beim Verlassen automatisch beendet. Match3 speichert nur abgeschlossene
Level ueber den vorhandenen Progress-Endpunkt. Taxi speichert beim Verlassen einer laufenden
Fahrt einen Zwischenstand ueber `/api/taxi/game-state`; abgeschlossene Fahrten werden als
Highscore gespeichert. Admin- und Verwaltungsrouten fuer Minigames werden nicht registriert und
bleiben ausschliesslich im Web-Adminbereich.
### 22. Admin spaeter
- [x] Entscheiden, ob Admin ueberhaupt in native App gehoert. - Ja, Admin gehört in die native App
- [x] Admin Users API-Vertraege erfassen.
- [x] Admin Rights API-Vertraege erfassen.
- [x] Moderation Reports API-Vertraege erfassen.
- [x] Adult Verification API-Vertraege erfassen.
- [x] Erotic Moderation API-Vertraege erfassen.
- [x] Forum Admin API-Vertraege erfassen.
- [x] Falukant Admin API-Vertraege erfassen.
- [x] Services Status Screen fuer interne Builds planen.
- [x] Admin nur per Feature Flag und Rollencheck sichtbar machen.
Entscheidung: Die native Administration wird nur eingeblendet, wenn sowohl
`FEATURE_ADMIN` aktiviert ist als auch die authentifizierte Anfrage an
`GET /api/navigation/:userid` einen Bereich `administration` liefert. Die vom Backend
gefilterte Navigation ist die Rechtequelle; die serverseitige Berechtigungsprüfung jeder
Admin-Route bleibt verbindlich. Direkte Navigation ohne beide Bedingungen zeigt keinen Inhalt.
API-Vertraege:
- Benutzer: `GET /api/admin/users/search?q=`, `GET /api/admin/users/:id`, `PUT /api/admin/users/:id`, `GET /api/admin/users/batch?ids=`, `GET /api/admin/users/statistics`; alle erfordern die vom Service gepruefte Berechtigung `useradministration` bzw. `mainadmin`.
- Rechte: `GET /api/admin/rights/types`, `GET /api/admin/rights/:id`, `POST /api/admin/rights/:id` und `DELETE /api/admin/rights/:id` mit `{ rightTypeId }`; Berechtigung `rights` bzw. `mainadmin`.
- Moderationsmeldungen: `GET /api/admin/moderation/reports?status=&limit=` sowie `POST /api/admin/moderation/reports/:reportId/status` mit Status und Review-Notiz; Berechtigung `forum` bzw. `mainadmin`.
- Altersverifikation: `GET /api/admin/users/adult-verification?status=`, `PUT /api/admin/users/:id/adult-verification` mit `approved`, `rejected` oder `pending`, sowie der geschuetzte Dokument-Download `GET /api/admin/users/:id/adult-verification/document`.
- Erotikmoderation: `GET /api/admin/users/erotic-moderation?status=`, geschuetzte Vorschau unter `/preview/:type/:targetId` und `PUT /api/admin/users/erotic-moderation/:id` mit erlaubter Aktion und optionaler Notiz.
- Forum: `GET` und `POST /api/forum/`, `DELETE /api/forum/:forumId`; Erstellen erwartet `{ name, permissions }`, die Service-Schicht prueft `forum` bzw. `mainadmin`. Allgemeine Meldungen laufen ueber den Moderationsvertrag.
- Falukant: Die geschuetzten Werkzeuge liegen unter `/api/admin/falukant/*`: Benutzersuche/-bearbeitung, Familien- und Schwangerschaftsaktionen, Bestands-/Region-/Distanzpflege, NPC-Auftraege und Titel. Die native Umsetzung beschraenkt sich auf klar abgegrenzte Fach-Screens mit serverseitiger `falukant`-/`mainadmin`-Pruefung; keine generische Datenbankbearbeitung.
Service-Status: Nur interne Debug-Builds erhalten einen kompakten, rein lesenden Statusscreen
auf Basis der bereits vorhandenen Backend-/Daemon-Verbindungssignale. Keine Prozessdaten,
Tokens, Konfigurationen oder Diagnose-Endpunkte werden in Release-Builds angezeigt. Die
Match3-/Taxi-Adminwerkzeuge bleiben gemaess Abschnitt 21 ausserhalb der nativen App.
### 23. Adult Content und Store-Compliance
- [x] Adult Content aus MVP entfernen oder per Feature Flag deaktivieren.
- [x] Altersverifikation nativ modellieren.
- [x] UGC-Melden nativ in Chat, Galerie, Forum, Profil implementieren.
- [x] Blockieren nativ implementieren.
- [x] Moderationserreichbarkeit dokumentieren.
- [x] Datenschutzseite nativ erreichbar machen.
- [x] Impressum nativ erreichbar machen.
- [x] Kontakt nativ erreichbar machen.
- [x] Account-Loeschung oder klare Anleitung nativ erreichbar machen.
- [x] Play Store Content Rating vorbereiten.
- [x] Store-Review-Risiko fuer Adult Content separat entscheiden.
Stand 2026-07-16: Der geschuetzte Bereich ist im lokalen Debug-Build per `FEATURE_ADULT`
aktiviert; Staging und Production bleiben bis zur Store-Entscheidung deaktiviert. Die native App
laedt den Status ueber `/api/settings/account` und laedt erst nach lokaler Pruefung von
Volljaehrigkeit und `adultAccessEnabled` die serverseitig ebenfalls geschuetzten Endpunkte unter
`/api/socialnetwork/erotic/*`. Ein Verifikationsnachweis (JPEG, PNG, WebP oder PDF) wird per
Android-Dateiauswahl an `/api/settings/adult-verification/request` gesendet. Die API prueft
zusaetzlich Alter und Verifikationsstatus. Die Account-Endpunkte weisen nun ausserdem Anfragen
ab, deren Body-`userId` nicht der authentifizierten `userid` entspricht.
Blockieren verwendet den neuen serverseitigen Vertrag `POST`/`DELETE
/api/socialnetwork/blocked-users/:userId` und die Migration
`20260716000000-create-user-block.sql`; der Profil-Screen bietet die Blockaktion nativ an.
Die Store-Entscheidung und Rating-Vorbereitung sind in `android/STORE_COMPLIANCE.md`
dokumentiert: Der Bereich bleibt ausserhalb lokaler Debug-Builds deaktiviert, bis eine formelle
Store- und Altersfreigabe vorliegt.
### 24. Push Notifications
- [x] Firebase Projekt klaeren.
- [x] FCM in native App integrieren.
- [x] Device Token Backend-Modell planen.
- [x] Device Token Registration API definieren.
- [x] Opt-in UI implementieren.
- [x] Notification Settings implementieren.
- [x] Chat Push definieren.
- [x] Friend Login Push definieren.
- [x] Falukant Event Push definieren.
- [x] Vocab Reminder Push definieren.
- [x] Deep Links aus Notifications implementieren.
- [x] Token Refresh Handling implementieren.
- [ ] Firebase-Service-Account im Backend-Deployment hinterlegen (`FIREBASE_SERVICE_ACCOUNT_PATH` oder `FIREBASE_SERVICE_ACCOUNT_JSON`).
### 25. Deep Links und OAuth
- [x] App Links Domain festlegen.
- [x] `assetlinks.json` planen.
- [x] Deep-Link-Struktur fuer Auth, Home, Social, Falukant, Vocab, Settings und Public Content definieren.
- [x] OAuth Redirect URIs fuer Android planen.
- [x] Custom Tabs Flow implementieren.
- [x] OAuth Callback Handling implementieren.
- [x] Deep Links fuer Profile, Forum, Falukant, Vocab, Blog definieren.
- [x] Deep Link Auth Guard implementieren.
- [x] Nicht eingeloggte Deep Links nach Login fortsetzen.
### 26. Sicherheit
- [x] Authdaten nicht im Klartext speichern.
- [x] Release Logging sensibler Daten verhindern.
- [x] Certificate Pinning bewerten, nicht vorschnell erzwingen.
- [x] Network Security Config fuer Release restriktiv halten.
- [x] Root/Jailbreak Detection bewusst entscheiden.
- [x] Screenshot-Schutz fuer Adult/Private Bereiche bewerten.
- [x] Datei-Uploads auf MIME/Größe pruefen.
- [x] WebView-Fallbacks minimieren.
- [x] Dependency-Scanning fuer Android einrichten.
### 27. Testing
- [x] Unit Tests fuer Auth Repository.
- [x] Unit Tests fuer Settings Repository.
- [x] Unit Tests fuer Error Mapping.
- [x] MockWebServer Tests fuer Auth Header.
- [x] MockWebServer Tests fuer API-Fehler.
- [x] Room Migration Tests.
- [x] Compose Tests fuer Login.
- [x] Compose Tests fuer Navigation.
- [x] Compose Tests fuer Home.
- [x] Compose Tests fuer Vocab Lesson.
- [x] Realtime Tests mit Testserver planen.
- [x] Emulator-Testmatrix definieren: kleines Phone, grosses Phone, Tablet.
- [x] Echtes Android-Geraet in Testmatrix aufnehmen.
- [x] Offline/Online-Wechsel testen.
- [x] App Kill/Restart/Resume testen.
- [ ] Instrumentation-Suite auf einem verbundenen Geraet oder KVM-faehigen Host ausfuehren (lokal blockiert: kein ADB-Geraet, keine x86_64-Hardwarebeschleunigung).
### 28. Build, Release und Betrieb
- [ ] Debug APK Build einrichten.
- [ ] Release AAB Build einrichten.
- [ ] Signing-Konzept definieren.
- [ ] Keystore sicher ablegen.
- [ ] Internal App Sharing oder interne Testspur planen.
- [ ] Crashlytics oder alternatives Crash Reporting entscheiden.
- [ ] Analytics bewusst entscheiden: ja/nein, Datenschutz.
- [ ] App Version Check implementieren oder planen.
- [ ] Rollback-Strategie definieren.
- [ ] Hybrid-App und Native-App Parallelbetrieb dokumentieren.
### 29. Backend-Vorbereitung fuer Native
- [ ] Release-Signaturfingerprint in die ausgelieferte `/.well-known/assetlinks.json` eintragen.
- [ ] Native OAuth-Redirect-URI bei jedem aktivierten Provider hinterlegen.
- [ ] Mobile API-Inventar aus allen Web-Komponenten erstellen.
- [ ] API-Versionierung bewerten: `/api/mobile/v1` ja/nein.
- [ ] Einheitliches Fehlerformat definieren.
- [ ] Einheitliches Pagination-Format definieren.
- [ ] Auth auf Bearer Token/JWT oder bestehendes `userid`/`authcode` final entscheiden.
- [ ] Refresh Token Konzept bewerten.
- [ ] Device Token API fuer Push planen.
- [ ] Datei-Upload-Limits dokumentieren.
- [ ] Image Thumbnail Endpunkte fuer mobile Listen planen.
- [ ] Falukant Summary Endpunkte fuer mobile Screens planen.
- [ ] Vocab Lesson Endpunkte fuer mobile Offline-Caches planen.
### 30. Abnahmekriterien MVP
- [ ] App startet kalt unter 2 Sekunden auf Testgeraet oder Zielwert begruendet anpassen.
- [ ] Login funktioniert gegen production/staging.
- [ ] Session ueberlebt App-Neustart.
- [ ] Logout entfernt lokale Session und trennt Realtime.
- [ ] Home laedt ohne WebView.
- [ ] Navigation ist vollstaendig nativ.
- [ ] Mindestens ein Social-Basisflow funktioniert.
- [ ] Mindestens ein Falukant-Basisflow funktioniert.
- [ ] Mindestens ein Vocab-Lesson-Flow funktioniert.
- [ ] Fehler werden nativ und verstaendlich angezeigt.
- [ ] Offline-Zustand wird erkannt und blockiert keine App.
- [ ] Keine lokalen Dev-URLs im Release-Build.
- [ ] Keine Secrets im APK/AAB.
- [ ] Datenschutz, Impressum und Kontakt sind erreichbar.
## Empfohlene erste Umsetzungsschritte
1. `/android/native` als neues Kotlin/Compose-Projekt anlegen.
2. Core Module fuer Network, Auth, Design und Navigation erstellen.
3. Login komplett nativ implementieren.
4. Session Store und Auth Interceptor stabilisieren.
5. Native App Shell mit Home und Navigation bauen.
6. Danach Social light, Falukant light und Vocab light nacheinander umsetzen.
## Realistische Einordnung
Die native Komplettumsetzung ist erheblich groesser als die Hybrid-App. Die Hybrid-App ist sinnvoll als lauffaehige Zwischenloesung und Referenzimplementierung. Die native App sollte als paralleles Produkt mit klarem MVP gestartet werden, sonst entsteht ein langer Rewrite ohne nutzbaren Zwischenstand.

View File

@@ -1,101 +0,0 @@
# YourPart Android
Android-App-Shell fuer YourPart auf Basis der bestehenden Vue/Vite-App und Capacitor.
## Entscheidungen
- App-ID: `de.yourpart.app`
- App-Name: `YourPart`
- Technologie: Capacitor mit lokal gebuendeltem `frontend/dist`
- Backend: bestehendes Backend wird verwendet, keine Backend-Implementierung in diesem Android-Start
- Erstes Ziel: interne Debug-/Test-APK
## Vorbereitung
1. Frontend-Env-Vorlage kopieren und Werte pruefen:
```bash
cp ../frontend/.env.android.example ../frontend/.env.android
```
2. Android-Dependencies installieren:
```bash
npm install
```
3. Web-Bundle fuer Android bauen:
```bash
npm run build:web
```
4. Android-Projekt erzeugen:
```bash
npm run add:android
```
5. Danach synchronisieren:
```bash
npm run sync
```
## Debug-Build
Nach `npm run add:android`:
```bash
npm run build:debug
```
Das erzeugte APK liegt danach unter `android/app/build/outputs/apk/debug/`.
Innerhalb dieses Repositorys ist das der Pfad `/android/android/app/build/outputs/apk/debug/`.
## Android Studio
In Android Studio muss das native Gradle-Projekt geoeffnet werden:
```text
/home/torsten/Programs/YourPart3/android/android
```
Nicht `/home/torsten/Programs/YourPart3/android` oeffnen. Dieser Ordner ist nur die Capacitor-Projektwurzel mit `package.json` und `capacitor.config.ts`; die Android-Studio-App liegt eine Ebene tiefer in `/android/android`.
Nach dem Oeffnen:
1. Gradle Sync abwarten.
2. Run Configuration `YourPart Debug` auswaehlen.
3. Emulator auswaehlen.
4. Starten.
Wenn Android Studio die Konfiguration nicht sofort anzeigt, `File > Sync Project with Gradle Files` ausfuehren oder das Projektfenster neu laden.
## Emulator-Eingabe
Die App verwendet die normale Android-WebView-Eingabe. `android.captureInput` ist bewusst nicht aktiviert, weil diese Capacitor-Option die WebView-InputConnection ersetzt und im Emulator verhindern kann, dass Textfelder normal beschrieben werden.
## Backend-CORS fuer Android-Debug
Capacitor laedt die lokale Android-App standardmaessig unter:
```text
https://localhost
```
Die API-Requests gehen weiterhin an `https://www.your-part.de/api/...`. Deshalb muss das Backend `https://localhost` in `CORS_ORIGINS` erlauben:
```env
CORS_ORIGINS=https://www.your-part.de,https://localhost,http://localhost:5173,http://127.0.0.1:5173
```
`server.hostname` in `capacitor.config.ts` darf nicht auf `www.your-part.de` gesetzt werden. Sonst interpretiert Capacitor Backend- und Model-URLs wie `/api/models/...glb` als lokale App-Assets.
## Wichtige Hinweise
- `frontend/.env.android` darf echte produktive URLs enthalten, aber keine Secrets.
- `VITE_DISABLE_3D=true` ist fuer Android-Debug absichtlich gesetzt. Das verhindert WebGL/GLB-Last auf der Login-Seite, bis CORS und 3D-Performance separat freigegeben sind.
- OAuth ist im ersten Debug-APK nicht der Blocker; Username/Passwort-Login ist die Pflichtfunktion.
- Push Notifications werden erst nach stabiler Shell geplant.
- Play Store ist vorerst kein Ziel, bis Datenschutz, UGC, Moderation und Adult-Content separat geprueft sind.

View File

@@ -1,37 +0,0 @@
# Native Android Security
## Umgesetzte Schutzmaßnahmen
- Die Sitzung liegt ausschließlich in `EncryptedSharedPreferences` mit Android-Master-Key.
- Release-Builds enthalten keinen HTTP-Body-Logger. Der detaillierte OkHttp-Logger ist auf
Nicht-Release-Builds begrenzt.
- Release-Netzwerkverkehr erlaubt kein Cleartext. Nur der lokale Debug-Flavor darf
`10.0.2.2` und `localhost` per HTTP ansprechen.
- Chat, Galerie, Persönliches und der Adult-Bereich setzen `FLAG_SECURE`. Damit verhindert
Android Screenshots, Bildschirmaufnahmen und die Anzeige im App-Switcher.
- Uploads werden vor dem Service auf einen erlaubten MIME-Typ und eine Größe begrenzt:
Bilder/Verifikationsnachweise 10 MiB, Videos 100 MiB. Bilder werden zusätzlich durch
Sharp dekodiert, damit ein behaupteter MIME-Typ nicht genügt.
## Bewusste Entscheidungen
### Certificate Pinning
Certificate Pinning wird aktuell **nicht** erzwungen. Die API verwendet HTTPS und die
plattformseitige Trust-Store-Prüfung. Pinning würde bei Zertifikats- oder CDN-Wechseln ohne
App-Update zu vollständigen Ausfällen führen. Es wird erst eingeführt, wenn es mindestens zwei
parallel gültige Pins, ein dokumentiertes Rotation-Verfahren und Monitoring für Pin-Fehler gibt.
### Root- und Bootloader-Erkennung
Die App blockiert gerootete Geräte nicht. Eine lokale Erkennung ist umgehbar und würde legitime
Nutzer sowie Emulator-Tests ausschließen. Sensible Daten bleiben verschlüsselt, Screenshots in
sensiblen Bereichen sind gesperrt und Berechtigungen werden auf dem Server durchgesetzt.
Play Integrity wird bei späteren Hochrisiko-Aktionen als serverseitig prüfbares Signal bewertet,
nicht als pauschale Startblockade.
## Dependency Scanning
`.github/workflows/android-security.yml` führt bei Pull Requests und Pushes einen
OSV-Abhängigkeitsscan sowie Android-Lint für den Produktions-Release aus. Kritische Findings
werden vor einem Release bewertet.

View File

@@ -1,17 +0,0 @@
# Store-Compliance
## Adult Content
- `FEATURE_ADULT` ist nur im lokalen Debug-Build aktiv.
- Staging und Production liefern keinen nativen Adult-Bereich aus.
- Vor einer Aktivierung sind Play-Content-Rating, Altersklassifizierung, Moderationsprozess,
Meldewege und die Store-Richtlinien erneut zu pruefen und freizugeben.
- Die API bleibt auch bei aktivem Client-Feature die Autoritaet: Volljaehrigkeit und der Status
`approved` der Altersverifikation sind fuer jeden geschuetzten Endpunkt erforderlich.
## UGC und Moderation
- Native Meldungen existieren fuer Chat, Forum, Profile, Gaestebuch und Galerie.
- Meldungen werden serverseitig gespeichert und sind fuer berechtigte Moderatoren sichtbar.
- Nutzerblockaden werden serverseitig in `community.user_block` gespeichert; die SQL-Migration
`backend/migrations/20260716000000-create-user-block.sql` ist vor dem Rollout auszufuehren.

View File

@@ -1,45 +0,0 @@
# Native Android Testmatrix
## Automatisiert
| Bereich | Testart | Ausführung |
| --- | --- | --- |
| Auth, Settings, HTTP-Fehler, Header, Daemon-Parser | JVM + MockWebServer | `./gradlew :app:testLocalDebugUnitTest` |
| Room-Migration und verschlüsselte Session nach Store-Neuerzeugung | Instrumentation | `./gradlew :app:connectedLocalDebugAndroidTest` |
| Login, Navigation, Home und Vokabel-Lektion | Compose Instrumentation | `./gradlew :app:connectedLocalDebugAndroidTest` |
| Realtime | JVM-Parser plus manueller Socket.IO-Testserver-Plan | siehe unten |
### Lokaler Ausfuehrungsstatus
- Die JVM-Suite (`:app:testLocalDebugUnitTest`) ist erfolgreich ausgefuehrt.
- Die Instrumentation-Suite inklusive Room- und Compose-Tests kompiliert erfolgreich.
- Die Ausfuehrung auf diesem Host ist blockiert: Es ist kein ADB-Geraet verbunden und die
x86_64-Emulatoren benoetigen KVM-Hardwarebeschleunigung, die hier nicht verfuegbar ist.
Das vorhandene ARM64-System-Image kann auf einem x86_64-Host nicht emuliert werden.
- Auf einem Host mit KVM oder einem verbundenen Geraet wird die Suite mit
`./gradlew :app:connectedLocalDebugAndroidTest` ausgefuehrt. Der CI-Workflow
`.github/workflows/android-tests.yml` fuehrt dieselbe Suite auf einem GitHub-Emulator aus.
## Emulator- und Geräte-Matrix
| Ziel | Pflichtfälle |
| --- | --- |
| Kleines Phone, API 34+ | Login, Navigation, Formular, Tastatur, Adult-Screenshotschutz |
| Großes Phone, API 34+ | Galerie, Falukant und Vokabel-Lektion |
| Tablet, API 34+ | Drawer, Landscape und Listenbreiten |
| Reales Android-Gerät, aktuelle API | Push-Berechtigung, OAuth Custom Tab, App Links, Kamera/Dateiauswahl |
Die Gradle Managed Devices `mediumPhone` und `mediumTablet` decken die CI-Basis ab. Das lokale
Team ergänzt für jeden Release-Lauf die installierten kleinen/großen Emulatoren und mindestens
ein reales Gerät.
## Netzwerk, Realtime und Lifecycle
1. Backend und Daemon starten, mit einem Testkonto anmelden und Socket.IO-Verbindung prüfen.
2. Backend stoppen: Offline-Banner, verständlicher Fehler und keine blockierte Navigation prüfen.
3. Backend wieder starten: Screen aktualisieren und Realtime-Verbindung erneut prüfen.
4. App im Hintergrund beenden und über Launcher oder Push erneut öffnen: verschlüsselte Sitzung,
Deep-Link-Fortsetzung und Realtime-Reconnect prüfen.
5. Für Socket.IO-Regressionen wird ein isolierter Node-Testserver mit den Ereignissen
`friendloginchanged`, `falukantUpdateStatus`, `familychanged` und `reloadmenu` verwendet.
Der Android-Test verbindet sich mit dessen URL statt mit Production.

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="YourPart Debug">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

View File

@@ -1,68 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="YourPart Debug" type="AndroidRunConfigurationType" factoryName="Android App">
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
<option name="ALLOW_ASSUME_VERIFIED" value="false" />
<option name="CLEAR_APP_STORAGE" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="RESTORE_ENABLED" value="false" />
<option name="RESTORE_FILE" value="" />
<option name="RESTORE_FRESH_INSTALL_ONLY" value="false" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="DEBUGGER_TYPE" value="Auto" />
<module name="android.app.main" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Hybrid>
<Java>
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Java>
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY" value="" />
<option name="ACTIVITY_CLASS" value="" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -1,54 +0,0 @@
apply plugin: 'com.android.application'
android {
namespace = "de.yourpart.app"
compileSdk = rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "de.yourpart.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
}
apply from: 'capacitor.build.gradle'
try {
def servicesJSON = file('google-services.json')
if (servicesJSON.text) {
apply plugin: 'com.google.gms.google-services'
}
} catch(Exception e) {
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}

View File

@@ -1,19 +0,0 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
}
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies {
implementation project(':capacitor-app')
}
if (hasProperty('postBuildExtras')) {
postBuildExtras()
}

View File

@@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -1,26 +0,0 @@
package de.yourpart.app;
import static org.junit.Assert.*;
import android.content.Context;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("de.yourpart.app", appContext.getPackageName());
}
}

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

View File

@@ -1,5 +0,0 @@
package de.yourpart.app;
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,34 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>

View File

@@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">YourPart</string>
<string name="title_activity_main">YourPart</string>
<string name="package_name">de.yourpart.app</string>
<string name="custom_url_scheme">de.yourpart.app</string>
</resources>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:background">@null</item>
</style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash</item>
</style>
</resources>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="." />
<cache-path name="my_cache_images" path="." />
</paths>

View File

@@ -1,18 +0,0 @@
package de.yourpart.app;
import static org.junit.Assert.*;
import org.junit.Test;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}

View File

@@ -1,30 +0,0 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Trigger sync
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.13.0'
classpath 'com.google.gms:google-services:4.4.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply from: "variables.gradle"
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@@ -1,6 +0,0 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
include ':capacitor-app'
project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')

View File

@@ -1,22 +0,0 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true

Binary file not shown.

View File

@@ -1,7 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -1,251 +0,0 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@@ -1,94 +0,0 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -1,5 +0,0 @@
include ':app'
include ':capacitor-cordova-android-plugins'
project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
apply from: 'capacitor.settings.gradle'

View File

@@ -1,16 +0,0 @@
ext {
minSdkVersion = 24
compileSdkVersion = 36
targetSdkVersion = 36
androidxActivityVersion = '1.11.0'
androidxAppCompatVersion = '1.7.1'
androidxCoordinatorLayoutVersion = '1.3.0'
androidxCoreVersion = '1.17.0'
androidxFragmentVersion = '1.8.9'
coreSplashScreenVersion = '1.2.0'
androidxWebkitVersion = '1.14.0'
junitVersion = '4.13.2'
androidxJunitVersion = '1.3.0'
androidxEspressoCoreVersion = '3.7.0'
cordovaAndroidVersion = '14.0.1'
}

View File

@@ -1,22 +0,0 @@
import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'de.yourpart.app',
appName: 'YourPart',
webDir: '../frontend/dist',
bundledWebRuntime: false,
server: {
androidScheme: 'https'
},
plugins: {
SplashScreen: {
launchAutoHide: true
}
},
android: {
allowMixedContent: false,
webContentsDebuggingEnabled: true
}
};
export default config;

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="YourPartNative.app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-07-10T13:18:31.238846181Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=/home/torsten/.config/.android/avd/Medium_Tablet.avd" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="/mnt/share/torsten/Programs/YourPart3/android/native" />
<option value="/mnt/share/torsten/Programs/YourPart3/android/native/app" />
</set>
</option>
</GradleProjectSettings>
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="/mnt/share/torsten/Programs/YourPart3/android/native" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="/mnt/share/torsten/Programs/YourPart3/android/native" />
<option value="/mnt/share/torsten/Programs/YourPart3/android/native/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="/mnt/share/torsten/Programs/YourPart3/android/native" />
</set>
</option>
</component>
</project>

View File

@@ -1,9 +0,0 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

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