Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Data Processing

Introduction

This document provides a comprehensive overview of data processing practices for our educational management system. As part of our commitment to data protection and privacy compliance (GDPR/DSGVO), we document what personal and operational data is intentionally collected, stored, and processed, as well as identify potential unintentional data capture points across all system tables.

Scope

This documentation describes all database tables defined in the current Prisma schema, with particular attention to the processing of personal data and related privacy implications. It also details the data stored in the Redis-powered cache, as well as the information collected during server monitoring (logs).


Data Processing Analysis by Table

1. Account Table

Purpose: User authentication and access management.

FieldData TypeIntentionally StoredPotentially Unintentional
accountIdIntegerUnique user identifierCould enable cross-system tracking
usernameStringPersonal identifier for loginMay reveal real names or personal info
passwordStringEncrypted authentication credentialHash algorithms may become vulnerable
createdAtBigIntAccount creation timestamp-
deletedAtBigIntAccount deletion timestamp-

Privacy Concerns:

  • Usernames might contain real names or other identifying information.
  • Password security is critically dependent on the strength and implementation of the hashing algorithm.
  • Personal data (username, password) is retained after the user has initiated deletion, creating a risk if the cleanup process fails.

Solutions:

  • Hashing using bcrypt: bcrypt automatically generates a unique random salt per password, making rainbow table attacks ineffective. We use a sufficient number of salt rounds (SALT_ROUNDS = 10).
  • Implemented a robust, automated cron job to ensure permanent deletion after the 30-day period.

2. Class Table

Purpose: Defines a class, acting as a central hub for all related data like students, subjects, events, homework and upload data.

FieldData TypeIntentionally StoredPotentially Unintentional
classIdIntegerUnique class identifier-
classNameStringThe name of the classMay identify a specific group of students
classCodeStringUnique encrypted code for students to join the classCould lead to abusive joins if class code is breached
classCodeHashStringUnique hashed code for students to join the class (fast lookup)Could lead to abusive joins if class code is breached
createdAtBigIntTimestamp of class creation-
isTestClassBooleanFlag to identify test/demo classes-
defaultPermissionLevelIntegerDefault user permission level for new members-
storageUsedBytesBigIntCurrent storage usage by the classMay reveal class activity level and content volume
storageQuotaBytesBigIntStorage limit allocated to the class-
dsbMobileActivatedBooleanFlag if DSBMobile is active-
dsbMobileUserStringThird-party service username (DSB Mobile)Risk: Credentials for external system
dsbMobilePasswordStringThird-party service password (DSB Mobile)Risk: Enables account compromise
dsbMobileClassStringClass Name to filter in substitution dataMay identify the specific class

Privacy Concerns:

  • Class centralizes all student data, making profile-building easier.

Solutions:

  • Implemented change class code function/button for class members.
  • Implemented strict access controls for rows containing third-party credentials.
  • Implemented secure (aes-256-gcm) server-side encryption for class codes, 3rd-party (DSB Mobile) migration coming soon

3. Event & EventType Tables

Purpose: Management of class-specific events (e.g., exams, holidays) and their categories.

Table.FieldData TypeIntentionally StoredPotentially Unintentional
Event.eventIdIntegerUnique event identifier-
Event.classIdIntegerLinks event to a specific class-
Event.eventTypeIdIntegerLinks event to a specific event type-
Event.name / desc.StringEvent title and detailsRisk: May contain personal info (student names, sensitive topics)
Event.isPinnedBooleanEvent pinning-
Event.startDate/endDateBigIntEvent schedulingReveals attendance/activity patterns
Event.lessonStringSpecific lesson block reference-
Event.teamIdIntegerLinks event to a specific teamReveals group-specific activities
Event.createdAtBigIntRecord creation timestamp-
EventType.eventTypeIdIntegerUnique event type identifier-
EventType.classIdIntegerLinks type to a specific class-
EventType.nameStringCategory name (e.g., “Exam”, “Field Trip”)Adds context that could have privacy implications (e.g., “Detention”)
EventType.colorStringEvent type color configuration-
EventType.createdAtBigIntRecord creation timestamp-

Privacy Concerns:

  • Free-text fields (name, description) are high-risk for unintentional storage of personal data.
  • The combination of event data, when linked to a Class, can reveal detailed schedules and activities for a specific group of students.

Solutions:

  • Provided clear guidance or input masks to discourage users from entering personal data in event names and descriptions.
  • Regularly audit event data for inappropriate content.

4. Homework & HomeworkCheck Tables

Purpose: Management of homework assignments and tracking student completion.

Table.FieldData TypeIntentionally StoredPotentially Unintentional
Homework.homeworkIdIntegerAssignment identifier-
Homework.classIdIntegerLinks homework to a specific class-
Homework.isPinnedBooleanHomework pinning-
Homework.contentStringAssignment detailsMay contain student-specific instructions or references
Homework.subjectIdIntegerLinks homework to a specific subject-
Homework.assignmentDateBigIntAssignment dateReveals grading/teaching pacing
Homework.submissionDateBigIntDeadline managementReveals individual work patterns
Homework.teamIdIntegerLinks homework to a specific teamReveals team-based assignments
Homework.createdAtBigIntRecord creation timestamp-
HomeworkCheck.checkIdIntegerUnique check identifier-
HomeworkCheck.accountIdIntegerStudent identifierDirect link to student performance
HomeworkCheck.homeworkIdIntegerAssignment referenceCreates detailed academic profile when combined with accountId
HomeworkCheck.createdAtBigIntRecord creation timestamp-

Privacy Concerns:

  • The HomeworkCheck table creates a direct, persistent record of individual student performance and behavior (completion status).
  • This data is highly valuable for academic analytics but is privacy-sensitive and can be used for student profiling.

5. JoinedClass & JoinedTeams Tables

Purpose: Manage the relationship between Accounts and the Class or Team they belong to.

Table.FieldData TypeIntentionally StoredPotentially Unintentional
JoinedClass.joinedClassIdIntegerUnique joined class identifier-
JoinedClass.accountIdIntegerStudent/user identifierLinks a specific user to a class
JoinedClass.classIdIntegerClass identifier-
JoinedClass.permissionLevelIntegerUser’s role/permissions in the class-
JoinedClass.createdAtBigIntRecord creation timestamp-
JoinedTeams.joinedTeamIdIntegerUnique joined team identifier-
JoinedTeams.accountIdIntegerStudent/user identifierCreates social network mapping within a class
JoinedTeams.teamIdIntegerGroup associationCould reveal social connections and group dynamics
JoinedTeams.createdAtBigIntRecord creation timestamp-

Privacy Concerns:

  • Social Graph: The JoinedTeams table explicitly maps out social connections and group affiliations within a class, which can be highly sensitive.
  • This data can be used to analyze social dynamics, peer relationships, and potential cliques.

6. Lesson Table

Purpose: Defines the weekly class schedule, including subjects, times, and locations.

FieldData TypeIntentionally StoredPotentially Unintentional
lessonIdIntegerUnique lesson identifier-
lessonNumber/weekDayIntegerSchedule structureReveals attendance patterns
classId/teamIdIntegerClass/group assignmentLinks schedule to specific groups
subjectIdIntegerSubject reference-
roomStringLocation managementMay reveal physical presence patterns
startTime/endTimeBigIntTime managementEnables detailed daily schedule tracking
createdAtBigIntRecord creation timestamp-

Privacy Concerns:

  • The combination of fields in this table allows for the reconstruction of a detailed daily schedule for student groups, including their physical location (room) at specific times.

7. Subjects Table

Purpose: Stores information about school subjects and their assigned teachers for a specific class.

FieldData TypeIntentionally StoredPotentially Unintentional
subjectIdIntegerUnique subject identifier-
subjectName…String / String[]Subject name and variations-
teacherGenderStringTeacher gender for display/adminPrivacy concern: May enable discrimination or profiling
teacherName…String / String[]Full and short teacher nameDirect personal identifiers of staff
classIdIntegerLinks subject to a specific class-
createdAtBigIntRecord creation timestamp-

Privacy Concerns:

  • Teacher’s Personal Data: This table directly stores identifiable personal data about teachers (teacherNameLong, teacherNameShort, teacherGender).
  • Consent: Ensure teacher consent is obtained for storing and displaying this information.

8. Team Table

Purpose: Defines a specific group (team) within a class.

FieldData TypeIntentionally StoredPotentially Unintentional
teamIdIntegerUnique team identifier-
nameStringName of the teamMay be revealing (e.g., “Advanced Group”, “Remedial Reading”)
classIdIntegerLinks team to a specific class-
createdAtBigIntRecord creation timestamp-

Privacy Concerns:

  • The name of a team could imply academic level, behavioral status, or other sensitive classifications about its members.

9. Upload & FileMetadata Tables

Purpose: Management of file uploads, upload requests and their metadata. An upload can contain one or multiple files.

Table.FieldData TypeIntentionally StoredPotentially Unintentional
Upload.uploadIdIntegerUnique upload job identifier-
Upload.uploadNameStringUser-provided name for the uploadMay contain personal info or sensitive content descriptions
Upload.uploadDescriptionStringUser-provided description for the uploadMay contain personal info or sensitive content descriptions
Upload.uploadTypeStringCategory/type of uploadCould reveal the nature of shared content
Upload.isPinnedBooleanUpload pinning-
Upload.statusStringProcessing state of uploadReveals system usage patterns
Upload.errorReasonStringError details if upload failedMay leak technical details or file content information
Upload.reservedBytesBigIntStorage space reserved for uploadIndicates size/scope of content being shared
Upload.createdAtBigIntUpload timestampReveals user activity patterns and collaboration timing
Upload.teamIdIntegerLinks upload to a specific teamCreates connection between users and shared content
Upload.accountIdIntegerIdentifier of user who uploadedDirect link to user and their shared content
Upload.classIdIntegerLinks upload to a specific class-
UploadRequest.uploadRequestIdIntegerUnique upload request identifier-
UploadRequest.uploadRequestNameStringUser-provided title of the upload requestMay contain personal or sensitive descriptions
UploadRequest.classIdIntegerLinks request to a specific classReveals class involvement
UploadRequest.teamIdIntegerLinks request to a specific teamMaps request to social/working groups
FileMetadata.fileMetaDataIdIntegerUnique file metadata identifier-
FileMetadata.uploadIdIntegerLinks file to its upload job-
FileMetadata.storedFileNameStringUUID-based filename on diskPrevents direct file access but enables file tracking
FileMetadata.mimeTypeStringFile type informationReveals nature of content (documents, images, videos, etc.)
FileMetadata.sizeIntegerFile size in bytesCombined with mime type, may identify specific content
FileMetadata.createdAtBigIntFile creation timestampEnables detailed activity tracking

Privacy Concerns:

  • Content Profiling: The combination of uploadName, uploadDescription, uploadType, mimeType, and size can create detailed profiles of what type of content users and teams are sharing.
  • User Attribution: The accountId field directly links uploaded content to specific users, creating a permanent record of who shared what.
  • Team Dynamics: Upload patterns (frequency, size, type) can reveal team collaboration dynamics and potentially identify active vs. inactive members.
  • Temporal Tracking: Timestamps enable detailed analysis of when users are active and how they collaborate over time.

Solutions:

  • Implement strict file type validation and size limits to prevent abuse.
  • Ensure errorReason messages are sanitized and do not expose sensitive details.
  • Implement retention policies for old uploads and automatic cleanup.
  • Monitor storage usage patterns to detect potential abuse.

Cross-Table Privacy Risks

The Class schema as a central entity increases cross-table risks.

1. Granular Profile Building

Combining data across tables enables the creation of highly detailed user profiles:

  • Student Profile: Academic performance (HomeworkCheck) + social connections (JoinedTeams) + daily schedule and location (Lesson) + specific activities (Event). All this data can be correlated through a combination of accountId and classId.

2. Behavioral and Social Analytics

  • The normalized structure allows for analytics on student behavior, such as correlating homework completion (HomeworkCheck) with team membership (JoinedTeams) or specific lessons (Lesson).
  • Social network graphs can be generated from the JoinedTeams and Account tables, revealing peer influence and group dynamics.

Data Collected and Stored in Redis and Telemetry Systems (Prometheus/Loki)

Redis

Our Redis architecture serves as a cache to temporarily store data, reducing database load and improving performance. Cached data is automatically cleared when the corresponding data is deleted from the database. The following types of content are stored:

  • Homework, events, lessons, timetables, teams, substitutions and upload metadata for each class
  • Authenticated user and class information
  • User sessions (from express-session)

Telemetry Data

To maintain and improve our service quality, we collect certain telemetry data, which is stored in server logs:

  • Date and time of the request
  • Endpoint path and HTTP method
  • HTTP status code
  • Size of the returned data
  • Referrer information
  • User agent details (e.g., browser name and version, operating system, etc.)

Retention: Logs are stored for 14 days (±2h) and are permanently deleted thereafter.


  • Document Version: 2.5
  • Stable Version Alignment: v2.2.6
  • Last Updated: May 26th, 2026
  • Next Scheduled Review: Quarterly – July 1st, 2026
  • Technical Contact: info@taskminder.de