Repository: SE-UUlm/snowballr-mock-backend
Pull request #6: Populate mock backend with dynamically loaded example data
Author: login: Merseleo
Created: 2025-02-26T15:55:44Z | Merged: 2025-03-11T11:16:27Z

Closes #4

## What I have made

<!-- write down what changes have been made, what was removed/added/changed -->

- extended mock backend to optionally dynamically load example data
  - the example data must be in a `.ts` file located in the `src/data/` folder
  - the data must be conform with the newly created `ExampleData` interface
  - the filename of the example data can be set via an environment variable `EXAMPLE_DATA_FILE`
- added one file containing example data for ...
  - users
  - criteria
  - projects
  - papers and project papers
  - reviews
  - **no** paper pdfs
- tried to improve the style and comments of the mock backend

Linked issue #4: Populate mock backend with dynamically loaded example data
## Problem

At the moment the mock backend doesn't contain any (exemplary) data. This is sufficient for the E2E tests, where it is possible and sensible to have a mock backend without any data and add all necessary data manually through the API calls. However, for playing around in the frontend, it is necessary to have some data coming from a backend. As the real backend currently isn't working and will be reworked, the mock backend could provide these data.

## Solution

Since it is probably preferable for E2E tests to start a mock backend without data and the data of the mock backend should probably be different for different scenarios, the sample data should be stored in a JSON file and loaded dynamically. It should be possible to control dynamic loading via an environment variable that (if available) points to a JSON file that is to be read in and processed. This processed data is then added to the ‘database’ of the mock backend.

## Alternatives considered

It would be easier to directly store some data in the arrays and maps in the mock backend, which would reduce duplicate data too.

Diff:
diff --git a/README.md b/README.md
index 1ce18ee..386a646 100644
--- a/README.md
+++ b/README.md
@@ -27,19 +27,33 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [src/data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+```
+
 ### Configuration
 
 A boolean variable may be enabled by setting it to either `1`, `yes`, or `true`.
 
-| Environment Variable | Default | Description                                                                                   |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------- |
-| `GRPC_PORT`          | 3000    | The port the native server should listen on                                                   |
-| `GRPC_WEB_PORT`      | 3001    | The port the gRPC web proxy should listen on                                                  |
-| `ENABLE_DUMMY_ADMIN` | false   | Whether or not to enable a dummy admin user                                                   |
-| `LOG_LEVEL`          | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`. |
+| Environment Variable     | Default | Description                                                                                                              |
+| ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------ |
+| `GRPC_PORT`              | 3000    | The port the native server should listen on                                                                              |
+| `GRPC_WEB_PORT`          | 3001    | The port the gRPC web proxy should listen on                                                                             |
+| `ENABLE_DUMMY_ADMIN`     | false   | Whether to enable a dummy admin user                                                                                     |
+| `LOG_LEVEL`              | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`.                            |
+| `EXAMPLE_DATA_FILE_PATH` | ""      | Relative path to a file inside [src/data/](src/data) containing example data for the mock backend (e.g. standardData.ts) |
 
 ## Tooling
 
diff --git a/package.json b/package.json
index 93283a8..1b158c2 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,7 @@
     "scripts": {
         "build": "npx tsc",
         "start": "node dist/main.js",
+        "dev": "npm run build && EXAMPLE_DATA_FILE=\"standardData.ts\" ENABLE_DUMMY_ADMIN=true npm run start",
         "watch": "nodemon src/main.ts",
         "format": "prettier --write .",
         "lint": "prettier --check . && eslint .",
diff --git a/src/data/standardData.ts b/src/data/standardData.ts
new file mode 100644
index 0000000..51f8b0f
--- /dev/null
+++ b/src/data/standardData.ts
@@ -0,0 +1,825 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+import assert from "node:assert";
+
+const NUMBER_OF_REVIEWS = 200;
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [
+    {
+        numberOfReviewers: 2,
+        patterns: [PATTERN_2[0], PATTERN_2[1], PATTERN_2[2]],
+    },
+    {
+        numberOfReviewers: 2,
+        patterns: [PATTERN_2[0], PATTERN_2[2], PATTERN_2[4]],
+    },
+    {
+        numberOfReviewers: 2,
+        patterns: [PATTERN_2[0], PATTERN_2[2], PATTERN_2[3], PATTERN_2[4]],
+    },
+    {
+        numberOfReviewers: 2,
+        patterns: [PATTERN_2[0], PATTERN_2[1], PATTERN_2[2], PATTERN_2[3]],
+    },
+    {
+        numberOfReviewers: 2,
+        patterns: [PATTERN_2[0], PATTERN_2[3], PATTERN_2[4]],
+    },
+    {
+        numberOfReviewers: 3,
+        patterns: [PATTERN_3[0], PATTERN_3[2], PATTERN_3[3]],
+    },
+    {
+        numberOfReviewers: 3,
+        patterns: [PATTERN_3[0], PATTERN_3[1], PATTERN_3[2], PATTERN_3[3]],
+    },
+    {
+        numberOfReviewers: 3,
+        patterns: [PATTERN_3[3], PATTERN_3[4], PATTERN_3[5]],
+    },
+    {
+        numberOfReviewers: 3,
+        patterns: [PATTERN_3[2], PATTERN_3[3], PATTERN_3[4]],
+    },
+    {
+        numberOfReviewers: 3,
+        patterns: [PATTERN_3[2], PATTERN_3[3], PATTERN_3[4], PATTERN_3[5]],
+    },
+];
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: `${index}`,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => `${i}`);
+const papers: Paper[] = [];
+
+assert(
+    PAPER_DOIS.length >= PAPER_TITLES.length,
+    "There must be must at least as much paper dois as paper titles.",
+);
+assert(
+    PAPER_ABSTRACTS.length >= PAPER_TITLES.length,
+    "There must be must at least as much paper abstracts as paper titles.",
+);
+assert(
+    PUBLICATION_NAMES.length >= PAPER_TITLES.length,
+    "There must be must at least as much publication names as paper titles.",
+);
+assert(PAPER_IDS.length >= 10, "There must be must at least paper (titles).");
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: `${index}`,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: Map<User, UserSettings> = new Map();
+for (const user of USERS) {
+    userSettings.set(user, {
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const readingLists: Map<User, Paper[]> = new Map();
+for (const user of USERS) {
+    readingLists.set(user, getRandomItems(papers, 4, 10));
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < NUMBER_OF_REVIEWS; i++) {
+    const selectedCriteria = getRandomItems(CRITERIA, 2, 4);
+    let decision = ReviewDecision.ACCEPTED;
+    if (
+        selectedCriteria.filter(
+            (criterion) => criterion.category === CriterionCategory.HARD_EXCLUSION,
+        ).length > 0
+    ) {
+        decision = ReviewDecision.DECLINED;
+    } else if (
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.EXCLUSION)
+            .length > 0 &&
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.INCLUSION)
+            .length > 0
+    ) {
+        decision = ReviewDecision.MAYBE;
+    }
+
+    reviews.push({
+        id: `${i}`,
+        userId: `${getRandomItems(USERS)[0].id}`,
+        decision: decision,
+        selectedCriteriaIds: selectedCriteria.map((criterion) => criterion.id),
+    });
+}
+
+const projectPapers: Project_Paper[] = [];
+for (const [index, paper] of papers.entries()) {
+    const reviewsOfPaper = Math.random() < 0.5 ? getRandomItems(reviews, 1, 3) : [];
+
+    let decision;
+    if (reviewsOfPaper.length === 0 || Math.random() < 0.2) {
+        decision = PaperDecision.UNDECIDED;
+    } else if (
+        reviewsOfPaper.filter((review) => review.decision === ReviewDecision.ACCEPTED).length >
+        reviewsOfPaper.filter((review) => review.decision === ReviewDecision.DECLINED).length
+    ) {
+        decision = PaperDecision.ACCEPTED;
+    } else {
+        decision = PaperDecision.DECLINED;
+    }
+    projectPapers.push({
+        id: `${index}`,
+        paper: paper,
+        stage: Math.random() < 0.3 ? 0n : BigInt(Math.floor(Math.random() * 2.5) + 1),
+        decision: decision,
+        reviews: reviewsOfPaper,
+    });
+}
+
+export const exampleData: ExampleData = {
+    availableFetchers: AVAILABLE_FETCHERS,
+    users: USERS,
+    readingLists: readingLists,
+    userSettings: userSettings,
+    projects: projects,
+    projectMembers: projectMembers,
+    criteria: CRITERIA,
+    papers: papers,
+    reviews: reviews,
+    projectPapers: projectPapers,
+};
diff --git a/src/auth-interceptor.ts b/src/interceptors/auth-interceptor.ts
similarity index 96%
rename from src/auth-interceptor.ts
rename to src/interceptors/auth-interceptor.ts
index 6d18756..63155ea 100644
--- a/src/auth-interceptor.ts
+++ b/src/interceptors/auth-interceptor.ts
@@ -7,7 +7,7 @@ import {
 } from "@grpc/grpc-js";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
 import { status } from "@grpc/grpc-js";
-import { getAuthenticated, isSnowballRService } from "./util";
+import { getAuthenticated, isSnowballRService } from "../util";
 
 /* eslint-disable  @typescript-eslint/no-explicit-any */
 
diff --git a/src/logging-interceptor.ts b/src/interceptors/logging-interceptor.ts
similarity index 96%
rename from src/logging-interceptor.ts
rename to src/interceptors/logging-interceptor.ts
index 9580d41..be9c594 100644
--- a/src/logging-interceptor.ts
+++ b/src/interceptors/logging-interceptor.ts
@@ -7,11 +7,10 @@ import {
 } from "@grpc/grpc-js";
 import { Status } from "@grpc/grpc-js/build/src/constants";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
-import { isSnowballRService } from "./util";
-import { LOG } from "./log";
+import { isSnowballRService } from "../util";
+import { LOG } from "../main";
 
 /* eslint-disable  @typescript-eslint/no-explicit-any */
-
 function stripPrefix(value: string, prefix: string) {
     return value.startsWith(prefix) ? value.substring(prefix.length) : value;
 }
diff --git a/src/log.ts b/src/log.ts
deleted file mode 100644
index 8d01484..0000000
--- a/src/log.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import pino from "pino";
-
-const level = process.env.LOG_LEVEL ?? "debug";
-
-export const LOG = pino({
-    level: level,
-    transport: {
-        target: "pino-pretty",
-    },
-});
diff --git a/src/main.ts b/src/main.ts
index 20cef51..b544c24 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,12 +1,15 @@
 import * as grpc from "@grpc/grpc-js";
 import { snowballRService } from "./service";
 import { snowballRDefinition } from "./grpc-gen/main.grpc-server";
-import { AUTH_INTERCEPTOR } from "./auth-interceptor";
-import { LOGGING_INTERCEPTOR } from "./logging-interceptor";
+import { AUTH_INTERCEPTOR } from "./interceptors/auth-interceptor";
+import { LOGGING_INTERCEPTOR } from "./interceptors/logging-interceptor";
 import { addReflection } from "grpc-server-reflection";
 import * as path from "path";
 import proxy from "@grpc-web/proxy";
-import { LOG } from "./log";
+import pino from "pino";
+import { loadExampleData, USERS } from "./model";
+import { UserRole, UserStatus } from "./grpc-gen/user";
+import { isOptionEnabled } from "./util";
 
 const PORT = process.env.GRPC_PORT ?? "3000";
 const WEB_PORT = process.env.GRPC_WEB_PORT ?? "3001";
@@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
+
+// Check, whether the dummy admin user should be added or not
+if (isOptionEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
+    LOG.warn("Security Risk: dummy admin user enabled!");
+    USERS.set("admin@admin", {
+        id: "admin@admin",
+        email: "admin@admin",
+        firstName: "admin",
+        lastName: "admin",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+        password: "admin",
+        accessToken: "admin",
+        refreshToken: "admin",
+    });
+    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+}
+
+// Check, whether a filepath to a file containing example data for the mock backend is set
+if (process.env.EXAMPLE_DATA_FILE) {
+    loadExampleData(process.env.EXAMPLE_DATA_FILE);
+}
diff --git a/src/model.ts b/src/model.ts
index db82d24..ca2bfd9 100644
--- a/src/model.ts
+++ b/src/model.ts
@@ -1,69 +1,135 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { toServerUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export let AVAILABLE_FETCHERS: string[] = [];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    availableFetchers?: string[];
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: Map<User, UserSettings>;
+    readingLists?: Map<User, Paper[]>;
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    AVAILABLE_FETCHERS = data.availableFetchers ?? [""];
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            toServerUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+        READING_LISTS.set(user.email, data.readingLists?.get(user) ?? []);
+        USER_SETTINGS.set(user.email, <UserSettings>data.userSettings?.get(user) ?? []);
+    });
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(CRITERIA.keys(), 5, 10));
+
+        // create a set of project papers
+        getRandomItems(data.projectPapers ?? [], 25, 40)
+            .filter((paper) => paper.stage <= project.maxStage)
+            .map((paper) => ({ ...paper, id: `${project.id}-${paper.id}` }))
+            .forEach((paper: Project_Paper) => {
+                PROJECT_PAPERS.set(paper.id, paper);
+                PROJECT_PROJECT_PAPERS.get(project.id)?.push(paper.id);
+
+                // add paper reviews in separate PAPER_REVIEWS map
+                PAPER_REVIEWS.set(
+                    paper.id,
+                    paper.reviews.map((review) => review.id),
+                );
+            });
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // set the progress of the project
+        const paperInStage = PROJECT_PROJECT_PAPERS.get(project.id)
+            ?.map((id) => PROJECT_PAPERS.get(id))
+            .filter((paper) => paper !== undefined && paper.stage === project.currentStage);
+        const numberOfReviewedPaperInStage =
+            paperInStage?.filter((paper) => paper?.decision !== PaperDecision.UNDECIDED).length ??
+            0;
+        const totalNumberOfPaperInStage = paperInStage?.length ?? Infinity;
+        PROGRESS.set(project.id, numberOfReviewedPaperInStage / totalNumberOfPaperInStage);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projectMembers?.forEach(({ projectId, members }) => MEMBERS.set(projectId, members));
+}
+
+/**
+ * Imports example data from another (typescript) file and initialize mock backend with all given
+ * data.
+ *
+ *
+ * @param filename the name of the file containing the example data
+ */
+export function loadExampleData(filename: string) {
+    import(`./data/${filename.replace(".ts", "")}`)
+        .then((loadedData: { exampleData: ExampleData }) => {
+            const data = loadedData.exampleData;
+
+            processExampleData(data);
+
+            LOG.info(
+                `Successfully load example data from file "${filename}". Server is starting with preloaded data...`,
+            );
+        })
+        .catch(() => {
+            LOG.error(
+                `Failed to load example data from file "${filename}". Falling back to default settings, so starting server with no initial data...`,
+            );
+        });
 }
diff --git a/src/service.ts b/src/service.ts
index a298a4c..13a6353 100644
--- a/src/service.ts
+++ b/src/service.ts
@@ -43,7 +43,6 @@ import {
 import { Review, Review_Create, Review_List, Review_Update } from "./grpc-gen/review";
 import { status } from "@grpc/grpc-js";
 import {
-    addProjectPaperReviews,
     AVAILABLE_FETCHERS,
     CRITERIA,
     MEMBERS,
@@ -61,6 +60,7 @@ import {
     USERS,
 } from "./model";
 import {
+    addProjectPaperReviews,
     anythingUndefined,
     findFirst,
     getAuthenticated,
@@ -206,15 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
             callback({
                 code: status.UNAUTHENTICATED,
                 details: "The old password is incorrect",
             });
+            return;
         }
+        USERS.get(user.email)!.password = newPassword;
+        callback(null, {});
     },
     getAllUsers: function (
         _: ServerUnaryCall<Nothing, User_List>,
@@ -238,23 +238,23 @@ export const snowballRService: ISnowballR = {
                 code: status.NOT_FOUND,
                 details: "User with given id was not found",
             });
-        } else {
-            callback(null, toUser(user));
+            return;
         }
+        callback(null, toUser(user));
     },
     getUserByEmail: function (
         call: ServerUnaryCall<Id, User>,
         callback: sendUnaryData<User>,
     ): void {
         const email = call.request.id;
-        if (USERS.has(email)) {
-            callback(null, toUser(USERS.get(email)!));
-        } else {
+        if (!USERS.has(email)) {
             callback({
                 code: status.NOT_FOUND,
                 details: "User with given email was not found",
             });
+            return;
         }
+        callback(null, toUser(USERS.get(email)!));
     },
     updateUser: function (
         call: ServerUnaryCall<User_Update, User>,
@@ -305,7 +305,7 @@ export const snowballRService: ISnowballR = {
         if (!USERS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "User not found",
+                details: "User with given id was not found",
             });
             return;
         }
@@ -322,7 +322,7 @@ export const snowballRService: ISnowballR = {
         if (!USERS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "User not found",
+                details: "User with given id was not found",
             });
             return;
         }
@@ -334,6 +334,7 @@ export const snowballRService: ISnowballR = {
         _: ServerUnaryCall<Nothing, Project_Paper_List>,
         callback: sendUnaryData<Project_Paper_List>,
     ): void {
+        // TODO: implement basic logic to get all papers to review for the current user
         callback(null, {
             projectPapers: Array.from(PROJECT_PAPERS.values())
                 .filter((pp) => pp.decision == PaperDecision.UNDECIDED)
@@ -349,7 +350,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with given id was not found",
             });
             return;
         }
@@ -366,7 +367,7 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<UserSettings>,
     ): void {
         const user = getAuthenticated(call.metadata)!;
-        callback(null, USER_SETTINGS.get(user.id)!);
+        callback(null, USER_SETTINGS.get(user.id));
     },
     updateUserSettings: function (
         call: ServerUnaryCall<UserSettings_Update, UserSettings>,
@@ -397,7 +398,7 @@ export const snowballRService: ISnowballR = {
             ...currentSettings,
             ...(update as UserSettings),
         });
-        callback(null, USER_SETTINGS.get(user.id)!);
+        callback(null, USER_SETTINGS.get(user.id));
     },
     getReadingList: function (
         call: ServerUnaryCall<Nothing, Paper_List>,
@@ -425,15 +426,14 @@ export const snowballRService: ISnowballR = {
         const user = getAuthenticated(call.metadata)!;
         const { id } = call.request;
         const paper = PAPERS.get(id);
-        if (paper == undefined) {
+        if (paper === undefined) {
             callback({
                 code: status.NOT_FOUND,
-                details: "The provided paper does not exist",
+                details: "The paper with the given id does not exist",
             });
-        } else {
-            READING_LISTS.get(user.id)!.push(paper);
-            callback(null, {});
         }
+        READING_LISTS.get(user.id)!.push(paper!);
+        callback(null, {});
     },
     removePaperFromReadingList: function (
         call: ServerUnaryCall<Id, Nothing>,
@@ -441,18 +441,18 @@ export const snowballRService: ISnowballR = {
     ): void {
         const user = getAuthenticated(call.metadata)!;
         const { id } = call.request;
-        if (READING_LISTS.get(user.id)?.some((p) => p.id == id)) {
-            READING_LISTS.set(
-                user.id,
-                READING_LISTS.get(user.id)!.filter((p) => p.id != id),
-            );
-            callback(null, {});
-        } else {
+        if (!READING_LISTS.get(user.id)?.some((p) => p.id == id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Paper id not found in reading list",
+                details: "The paper with the given id was not found in reading list",
             });
+            return;
         }
+        READING_LISTS.set(
+            user.id,
+            READING_LISTS.get(user.id)!.filter((p) => p.id != id),
+        );
+        callback(null, {});
     },
     getPendingInvitationsForUser: function (
         _: ServerUnaryCall<Id, Project_List>,
@@ -489,7 +489,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project does not exist",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -507,7 +507,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(projectId)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project does not exist",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -620,7 +620,7 @@ export const snowballRService: ISnowballR = {
             PROJECT_CRITERIA.get(id)!.push(criterionId);
         }
 
-        callback(null, PROJECTS.get(id)!);
+        callback(null, PROJECTS.get(id));
     },
     getProjectById: function (
         call: ServerUnaryCall<Id, Project>,
@@ -630,12 +630,12 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project was not found",
+                details: "Project with the given id was not found",
             });
             return;
         }
 
-        callback(null, PROJECTS.get(id)!);
+        callback(null, PROJECTS.get(id));
     },
     updateProject: function (
         call: ServerUnaryCall<Project_Update, Project>,
@@ -646,7 +646,7 @@ export const snowballRService: ISnowballR = {
         if (project?.id == undefined || !PROJECTS.has(project.id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project was not found",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -667,7 +667,7 @@ export const snowballRService: ISnowballR = {
             ...currentProject,
             ...(update as Project),
         });
-        callback(null, PROJECTS.get(project.id)!);
+        callback(null, PROJECTS.get(project.id));
     },
     exportProject: function (
         _: ServerUnaryCall<ExportRequest, Blob>,
@@ -687,7 +687,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -704,7 +704,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -721,7 +721,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(projectId)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -735,30 +735,30 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Criterion>,
     ): void {
         const { id } = call.request;
-        if (CRITERIA.has(id)) {
-            callback(null, CRITERIA.get(id)!);
-        } else {
+        if (!CRITERIA.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Criterion not found",
+                details: "Criterion with the given id was not found",
             });
+            return;
         }
+        callback(null, CRITERIA.get(id));
     },
     getAllCriteriaForProject: function (
         call: ServerUnaryCall<Id, Criterion_List>,
         callback: sendUnaryData<Criterion_List>,
     ): void {
         const { id } = call.request;
-        if (PROJECT_CRITERIA.has(id)) {
-            callback(null, {
-                criteria: PROJECT_CRITERIA.get(id)!.map((id) => CRITERIA.get(id)!),
-            });
-        } else {
+        if (!PROJECT_CRITERIA.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
+            return;
         }
+        callback(null, {
+            criteria: PROJECT_CRITERIA.get(id)!.map((id) => CRITERIA.get(id)!),
+        });
     },
     createCriterion: function (
         call: ServerUnaryCall<Criterion_Create, Criterion>,
@@ -768,7 +768,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECTS.has(projectId)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
             return;
         }
@@ -783,7 +783,7 @@ export const snowballRService: ISnowballR = {
         });
 
         PROJECT_CRITERIA.get(projectId)!.push(id);
-        callback(null, CRITERIA.get(id)!);
+        callback(null, CRITERIA.get(id));
     },
     updateCriterion: function (
         call: ServerUnaryCall<Criterion_Update, Criterion>,
@@ -802,7 +802,7 @@ export const snowballRService: ISnowballR = {
         if (!CRITERIA.has(criterion.id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Criterion not found",
+                details: "Criterion with the given id was not found",
             });
             return;
         }
@@ -844,58 +844,58 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Project_Paper>,
     ): void {
         const { id } = call.request;
-        if (PROJECT_PAPERS.has(id)) {
-            callback(null, addProjectPaperReviews(PROJECT_PAPERS.get(id)!));
-        } else {
+        if (!PROJECT_PAPERS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project Paper not found",
+                details: "Project paper with the given id was not found",
             });
+            return;
         }
+        callback(null, addProjectPaperReviews(PROJECT_PAPERS.get(id)!));
     },
     getAllProjectPapersForProject: function (
         call: ServerUnaryCall<Id, Project_Paper_List>,
         callback: sendUnaryData<Project_Paper_List>,
     ): void {
         const { id } = call.request;
-        if (PROJECTS.has(id)) {
-            callback(null, {
-                projectPapers: PROJECT_PROJECT_PAPERS.get(id)!
-                    .map((ppp) => PROJECT_PAPERS.get(ppp)!)
-                    .map(addProjectPaperReviews),
-            });
-        } else {
+        if (!PROJECTS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
+            return;
         }
+        callback(null, {
+            projectPapers: PROJECT_PROJECT_PAPERS.get(id)!
+                .map((ppp) => PROJECT_PAPERS.get(ppp)!)
+                .map(addProjectPaperReviews),
+        });
     },
     addPaperToProject: function (
         call: ServerUnaryCall<Project_Paper_Add, Project_Paper>,
         callback: sendUnaryData<Project_Paper>,
     ): void {
         const { projectId, paperId, stage } = call.request;
-        if (PROJECTS.has(projectId)) {
-            const id = getNextId(PROJECT_PAPERS);
-            const project_paper: Project_Paper = {
-                id: id,
-                stage: stage,
-                decision: PaperDecision.UNDECIDED,
-                reviews: [],
-                paper: PAPERS.get(paperId)!,
-            };
-            PROJECT_PAPERS.set(id, project_paper);
-            PAPER_REVIEWS.set(id, []);
-            PROJECT_PROJECT_PAPERS.get(projectId)!.push(id);
-            PROGRESS.set(projectId, Math.min(PROGRESS.get(projectId) || 0 + 0.05, 1.0));
-            callback(null, project_paper);
-        } else {
+        if (!PROJECTS.has(projectId)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project not found",
+                details: "Project with the given id was not found",
             });
+            return;
         }
+        const id = getNextId(PROJECT_PAPERS);
+        const project_paper: Project_Paper = {
+            id: id,
+            stage: stage,
+            decision: PaperDecision.UNDECIDED,
+            reviews: [],
+            paper: PAPERS.get(paperId)!,
+        };
+        PROJECT_PAPERS.set(id, project_paper);
+        PAPER_REVIEWS.set(id, []);
+        PROJECT_PROJECT_PAPERS.get(projectId)!.push(id);
+        PROGRESS.set(projectId, Math.min((PROGRESS.get(projectId) ?? 0) + 0.05, 1.0));
+        callback(null, project_paper);
     },
     updateProjectPaper: function (
         call: ServerUnaryCall<Project_Paper_Update, Project_Paper>,
@@ -914,7 +914,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECT_PAPERS.has(projectPaper.id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project paper not found",
+                details: "Project paper with the given id was not found",
             });
             return;
         }
@@ -955,30 +955,30 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Review>,
     ): void {
         const { id } = call.request;
-        if (REVIEWS.has(id)) {
-            callback(null, REVIEWS.get(id)!);
-        } else {
+        if (!REVIEWS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Review not found",
+                details: "Review with the given id was not found",
             });
+            return;
         }
+        callback(null, REVIEWS.get(id));
     },
     getAllReviewsForProjectPaper: function (
         call: ServerUnaryCall<Id, Review_List>,
         callback: sendUnaryData<Review_List>,
     ): void {
         const { id } = call.request;
-        if (PAPER_REVIEWS.has(id)) {
-            callback(null, {
-                reviews: PAPER_REVIEWS.get(id)!.map((id) => REVIEWS.get(id)!),
-            });
-        } else {
+        if (!PAPER_REVIEWS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Review not found",
+                details: "Review with the given id was not found",
             });
+            return;
         }
+        callback(null, {
+            reviews: PAPER_REVIEWS.get(id)!.map((id) => REVIEWS.get(id)!),
+        });
     },
     createReview: function (
         call: ServerUnaryCall<Review_Create, Review>,
@@ -989,7 +989,7 @@ export const snowballRService: ISnowballR = {
         if (!PROJECT_PAPERS.has(projectPaperId)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Project paper not found",
+                details: "Project paper with the given id was not found",
             });
             return;
         }
@@ -1003,7 +1003,7 @@ export const snowballRService: ISnowballR = {
         });
 
         PAPER_REVIEWS.get(projectPaperId)!.push(id);
-        callback(null, REVIEWS.get(id)!);
+        callback(null, REVIEWS.get(id));
     },
     updateReview: function (
         call: ServerUnaryCall<Review_Update, Review>,
@@ -1022,7 +1022,7 @@ export const snowballRService: ISnowballR = {
         if (!REVIEWS.has(review.id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Review not found",
+                details: "Review with the given id was not found",
             });
             return;
         }
@@ -1043,7 +1043,7 @@ export const snowballRService: ISnowballR = {
             ...currentReview,
             ...(update as Review),
         });
-        callback(null, REVIEWS.get(review.id)!);
+        callback(null, REVIEWS.get(review.id));
     },
     deleteReview: function (
         call: ServerUnaryCall<Id, Nothing>,
@@ -1064,14 +1064,14 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Paper>,
     ): void {
         const { id } = call.request;
-        if (PAPERS.has(id)) {
-            callback(null, PAPERS.get(id)!);
-        } else {
+        if (!PAPERS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Paper not found",
+                details: "Paper with the given id was not found",
             });
+            return;
         }
+        callback(null, PAPERS.get(id));
     },
     createPaper: function (
         call: ServerUnaryCall<Paper, Paper>,
@@ -1084,7 +1084,7 @@ export const snowballRService: ISnowballR = {
             id: id,
         });
         PAPER_PDFS.set(id, new Uint8Array());
-        callback(null, PAPERS.get(id)!);
+        callback(null, PAPERS.get(id));
     },
     updatePaper: function (
         call: ServerUnaryCall<Paper_Update, Paper>,
@@ -1103,7 +1103,7 @@ export const snowballRService: ISnowballR = {
         if (!PAPERS.has(paper.id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Paper not found",
+                details: "Paper with the given id was not found",
             });
             return;
         }
@@ -1124,8 +1124,9 @@ export const snowballRService: ISnowballR = {
             ...currentPaper,
             ...(update as Paper),
         });
-        callback(null, PAPERS.get(paper.id)!);
+        callback(null, PAPERS.get(paper.id));
     },
+    /// TODO: replace the following two calls with better implementations
     getForwardReferencedPapers: function (
         _: ServerUnaryCall<Id, Paper_List>,
         callback: sendUnaryData<Paper_List>,
@@ -1144,29 +1145,29 @@ export const snowballRService: ISnowballR = {
     },
     getPaperPdf: function (call: ServerUnaryCall<Id, Blob>, callback: sendUnaryData<Blob>): void {
         const { id } = call.request;
-        if (PAPER_PDFS.has(id)) {
-            callback(null, {
-                data: PAPER_PDFS.get(id)!,
-            });
-        } else {
+        if (!PAPER_PDFS.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Paper not found",
+                details: "Paper with the given id was not found",
             });
+            return;
         }
+        callback(null, {
+            data: PAPER_PDFS.get(id)!,
+        });
     },
     setPaperPdf: function (
         call: ServerUnaryCall<Paper_PdfUpdate, Nothing>,
         callback: sendUnaryData<Nothing>,
     ): void {
         const { paperId, pdf } = call.request;
-        if (PAPER_PDFS.has(paperId)) {
-            PAPER_PDFS.set(paperId, pdf?.data ?? new Uint8Array());
-        } else {
+        if (!PAPER_PDFS.has(paperId)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Paper not found",
+                details: "Paper with the given id was not found",
             });
+            return;
         }
+        PAPER_PDFS.set(paperId, pdf?.data ?? new Uint8Array());
     },
 };
diff --git a/src/util.ts b/src/util.ts
index f561680..8c8f19d 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -1,13 +1,52 @@
 import { Metadata } from "@grpc/grpc-js";
-import { ServerUser, USERS } from "./model";
+import { PAPER_REVIEWS, REVIEWS, ServerProjectPaper, ServerUser, USERS } from "./model";
 import { User } from "./grpc-gen/user";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
+import { LoginSecret } from "./grpc-gen/authentication";
+import { Project_Paper } from "./grpc-gen/project";
 
+/**
+ * Checks whether a string is empty
+ *
+ * @param string the string to check against the empty string
+ * @return true, if the string is empty or null, otherwise false
+ */
 export function isEmpty(string: string | null): boolean {
     if (string == null) return true;
     else return string.trim().length == 0;
 }
 
+/**
+ * Select random items from a list. The number of items to be selected
+ * is randomly chosen from a value between the minimum and maximum number.
+ * The default minimum and maximum number is 1, so if only the list is given,
+ * only one random item is selected.
+ *
+ * If the number of items to be chosen is greater that the number of items in the list,
+ * the entire list is returned
+ *
+ * @param list the list from which items are randomly selected of
+ * @param minNumberOfItems the minimum number of items to be chosen
+ * @param maxNumberOfItems the maximum number of items to be chosen
+ * @return the list containing the randomly selected items
+ */
+export function getRandomItems<T>(
+    list: Iterable<T>,
+    minNumberOfItems = 1,
+    maxNumberOfItems = 1,
+): T[] {
+    const shuffledList = [...list].sort(() => Math.random() - 0.5);
+    return shuffledList.slice(
+        0,
+        Math.floor(Math.random() * (maxNumberOfItems - minNumberOfItems)) + minNumberOfItems,
+    );
+}
+
+/**
+ * Generates a random alphanumeric string
+ *
+ * @param length the length of the random string
+ */
 function randomString(length: number): string {
     const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
     const randomNum = () => Math.floor(Math.random() * alphabet.length);
@@ -17,6 +56,9 @@ function randomString(length: number): string {
 }
 
 const tokens: string[] = [];
+/**
+ * Generates a random token, which is a random alphanumeric string of length 40
+ */
 export function randomToken(): string {
     let token = randomString(40);
     while (tokens.some((t) => t == token)) {
@@ -26,12 +68,48 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @privateRemarks
+ *
+ * At the moment the frontend has no implementation for adding the "Authorization" header.
+ * As the different calls in mock backend are already protected with authentication,
+ * using this mock backend in the frontend is useless, as you always would get an "Unauthenticated"
+ * error. Hence, this method currently constantly return a user that is "logged in".
+ * This must be changed as soon as the authentication is completed in the frontend.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
     if (authorization.trim() == "") return null;
-    return findFirst(USERS.values(), "accessToken", authorization);
+    return findFirst(USERS.values(), "accessToken", authorization);*/
+    return USERS.get("alice.smith@example.com")!;
+}
+
+/**
+ * Converts a user into a server user, so the user information are extended by the password and tokens
+ * of the user.
+ *
+ * @param user the user object to be extended
+ * @param password the password of the user
+ * @param loginSecret the login secret, so the authorization and refresh tokens of the user
+ * @return the server user created from the user, password and login secret
+ */
+export function toServerUser(user: User, password: string, loginSecret: LoginSecret): ServerUser {
+    return {
+        ...user,
+        ...loginSecret,
+        password: password,
+    };
 }
 
+/**
+ * Converts a server user (= user with password and login credentials) to a normal user.
+ */
 export function toUser(serverUser: ServerUser): User {
     return {
         id: serverUser.id,
@@ -43,6 +121,20 @@ export function toUser(serverUser: ServerUser): User {
     };
 }
 
+export function isSnowballRService<TRequest, TResponse>(
+    methodDescriptor: ServerMethodDefinition<TRequest, TResponse>,
+): boolean {
+    return methodDescriptor.path.startsWith("/snowballr.SnowballR/");
+}
+
+/**
+ * Finds the first object that has a specific key-value pair.
+ *
+ * @param objects an iterable collection of objects.
+ * @param key the key to check in each object.
+ * @param value the value to match against.
+ * @return the first object that matches the key-value condition, null if nothing was found
+ */
 export function findFirst<T, K extends keyof T, V extends T[K]>(
     objects: Iterable<T>,
     key: K,
@@ -53,21 +145,15 @@ export function findFirst<T, K extends keyof T, V extends T[K]>(
             return object;
         }
     }
-
     return null;
 }
 
-export function anythingUndefined<T extends object>(obj: T): boolean {
-    return Object.values(obj).some((v) => {
-        return v == undefined || (typeof v === "object" && anythingUndefined(v));
-    });
-}
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export function isSnowballRService(methodDescriptor: ServerMethodDefinition<any, any>): boolean {
-    return methodDescriptor.path.startsWith("/snowballr.SnowballR/");
-}
-
+/**
+ * Generates the next id.
+ *
+ * @param objs the map of already exist elements with ids
+ * @return the next available id
+ */
 export function getNextId<T extends Map<string, V>, V>(objs: T): string {
     let i = objs.size;
     while (objs.has(i.toString())) {
@@ -75,3 +161,43 @@ export function getNextId<T extends Map<string, V>, V>(objs: T): string {
     }
     return i.toString();
 }
+
+/**
+ * Adds review details to a project paper.
+ *
+ * @param paper the project paper to extend with review information
+ * @return the new project paper with an added 'reviews' array populated from the associated reviews
+ */
+export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
+    return {
+        ...paper,
+        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
+    };
+}
+
+/**
+ * Checks if any property in an object (including nested objects) is undefined.
+ *
+ * @param obj the object to check
+ * @returns true if any property (or sub-property) is undefined, otherwise false
+ */
+export function anythingUndefined<T extends object>(obj: T): boolean {
+    return Object.values(obj).some((v) => {
+        return v == undefined || (typeof v === "object" && anythingUndefined(v));
+    });
+}
+
+/**
+ * Checks whether the given string indicates that an option is enabled.
+ * An option is considered as enabled, if it is set to either:
+ * - 1
+ * - (y/Y)es
+ * - (t/T)rue
+ *
+ * @param option the input to check
+ * @return true, if the given option is set to value listed above, otherwise false
+ */
+export function isOptionEnabled(option?: string): boolean {
+    option = option?.toLowerCase() ?? "";
+    return ["1", "yes", "true"].includes(option);
+}


Reviews:
user: login: Slartibartfass2
body: Looks great. Thank you for adding all this data, so we can finally use the mock backend.

What are your thoughts on a template, i.e., the `standardData` file but with empty lists. So whenever somebody would like to add their own data file, they could use the template.

**Edit:** You made a change during my review. My review is for `d061c8793ba95b0b9c38ca1ff91890f8b090c0f6`
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-07T09:59:45Z
user: login: Slartibartfass2
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-07T10:01:14Z
user: login: Slartibartfass2
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-07T10:02:42Z
user: login: Merseleo
body: Thank you for the detailed review, I hope I dont forget to address anything. 
I tried to applied all of your feedback, however some points need to be discussed imo, because it seems like over engineering the mock backend. It will be only used for E2E tests and does not need to conform to the same standards as a real backend imo.
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T08:55:24Z
user: login: Slartibartfass2
body: Looks great now.

Can we add a custom command for `npm run build && EXAMPLE_DATA_FILE="standardData.ts" ENABLE_DUMMY_ADMIN=true npm run start` e.g. `npm run dev`?

I'm fine with not adding the template. Let's focus on getting things done! 
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T12:13:48Z
user: login: Merseleo
body: I think I solved all problems.
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T15:04:40Z
user: login: Slartibartfass2
body: Abfahrt 🚀 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T11:14:29Z

Review comments:
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
path: README.md
user: login: Slartibartfass2
body: Provide the same path when displaying the `data` directory.
```suggestion
This file must be located in the [src/data/](src/data) directory. The data in this file is then imported and,
```
created_at: 2025-03-07T08:01:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
path: README.md
user: login: Slartibartfass2
body: Minor: trailing newline
```suggestion
};
```
created_at: 2025-03-07T08:02:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
+```
+
 ### Configuration
 
 A boolean variable may be enabled by setting it to either `1`, `yes`, or `true`.
 
-| Environment Variable | Default | Description                                                                                   |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------- |
-| `GRPC_PORT`          | 3000    | The port the native server should listen on                                                   |
-| `GRPC_WEB_PORT`      | 3001    | The port the gRPC web proxy should listen on                                                  |
-| `ENABLE_DUMMY_ADMIN` | false   | Whether or not to enable a dummy admin user                                                   |
-| `LOG_LEVEL`          | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`. |
+| Environment Variable     | Default | Description                                                                                                          |
+| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------- |
+| `GRPC_PORT`              | 3000    | The port the native server should listen on                                                                          |
+| `GRPC_WEB_PORT`          | 3001    | The port the gRPC web proxy should listen on                                                                         |
+| `ENABLE_DUMMY_ADMIN`     | false   | Whether or not to enable a dummy admin user                                                                          |
path: README.md
user: login: Slartibartfass2
body: It's just "Whether", "Whether or not" would be "Ob oder nicht"
```suggestion
| `ENABLE_DUMMY_ADMIN`     | false   | Whether to enable a dummy admin user                                                                                 |
```
created_at: 2025-03-07T08:04:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
+```
+
 ### Configuration
 
 A boolean variable may be enabled by setting it to either `1`, `yes`, or `true`.
 
-| Environment Variable | Default | Description                                                                                   |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------- |
-| `GRPC_PORT`          | 3000    | The port the native server should listen on                                                   |
-| `GRPC_WEB_PORT`      | 3001    | The port the gRPC web proxy should listen on                                                  |
-| `ENABLE_DUMMY_ADMIN` | false   | Whether or not to enable a dummy admin user                                                   |
-| `LOG_LEVEL`          | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`. |
+| Environment Variable     | Default | Description                                                                                                          |
+| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------- |
+| `GRPC_PORT`              | 3000    | The port the native server should listen on                                                                          |
+| `GRPC_WEB_PORT`          | 3001    | The port the gRPC web proxy should listen on                                                                         |
+| `ENABLE_DUMMY_ADMIN`     | false   | Whether or not to enable a dummy admin user                                                                          |
+| `LOG_LEVEL`              | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`.                        |
+| `EXAMPLE_DATA_FILE_PATH` | ""      | Relative or absolute filepath to a file containing example data for the mock backend (e.g. ./data/standardData.json) |
path: README.md
user: login: Slartibartfass2
body: This doesn't seem up-to-date.
According to your implementation, the user would have to pass a relative path inside the data directory. An absolute path would lead to an error.
Furthermore, it's not a JSON file.
```suggestion
| `EXAMPLE_DATA_FILE_PATH` | ""      | Relative path to a file inside [src/data/](src/data) containing example data for the mock backend (e.g. standardData.ts) |
```
**Note:** it has to be JS if it's imported from somewhere else because it either needs to be transpiled from TS to JS (what only happens in the data directory) or it's JS from the beginning.
Or change the implementation.
created_at: 2025-03-07T08:13:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Slartibartfass2
body: Where is `PATTERN_1`? (or `PATTERN_0`) 😅 
created_at: 2025-03-07T08:18:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Slartibartfass2
body: I just noticed, you mean the number of reviews. 🤦🏼‍♂️ 
created_at: 2025-03-07T08:20:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Slartibartfass2
body: While reading these examples, I noticed that it's probably better to just store the number of decisions per decision type, e.g., 2 accepted, 1 declined, …
Because in the logic, you would need to count it either way, i.e., the order is irrelevant.
created_at: 2025-03-07T08:22:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
path: src/data/standardData.ts
user: login: Slartibartfass2
body: I'm not sure if it makes sense to randomize these, as they should be exhaustive.
created_at: 2025-03-07T08:27:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
path: src/data/standardData.ts
user: login: Slartibartfass2
body: I already mentioned this in your other PR, what about the following:
```suggestion
        id: `${index}`,
```
created_at: 2025-03-07T08:36:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
path: src/data/standardData.ts
user: login: Slartibartfass2
body: 😉 
```suggestion
const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => `${i}`);
const papers: Paper[] = [];
for (const [index, paperTitle] of PAPER_TITLES.entries()) {
    papers.push({
        id: `${index}`,
```
created_at: 2025-03-07T08:40:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
path: src/data/standardData.ts
user: login: Slartibartfass2
body: We access those array with `index` with the assumption that those arrays have at least the same size.
What are your thoughts on adding a handful of assertions to ensure this and provide sensible error messages.
Especially for the idea of a template, this would make sense.
created_at: 2025-03-07T08:43:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
path: src/data/standardData.ts
user: login: Slartibartfass2
body: What are your thoughts on adding those numbers at the top of the file as variables, so they could be changed easily:
```suggestion
for (let i = 0; i < NUMBER_OF_USER_SETTINGS; i++) {
    userSettings.push({
        showHotkeys: Math.random() < 0.5,
        reviewMode: Math.random() < 0.8,
        defaultProjectSettings: getRandomItems(projectSettings)[0],
        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
    });
}

const reviews: Review[] = [];
for (let i = 0; i < NUMBER_OF_REVIEWS; i++) {
```
created_at: 2025-03-07T08:47:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
+    const selectedCriteria = getRandomItems(CRITERIA, 2, 4);
+    let decision = ReviewDecision.ACCEPTED;
+    if (
+        selectedCriteria.filter(
+            (criterion) => criterion.category === CriterionCategory.HARD_EXCLUSION,
+        ).length > 0
+    ) {
+        decision = ReviewDecision.DECLINED;
+    } else if (
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.EXCLUSION)
+            .length > 0 &&
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.INCLUSION)
+            .length > 0
+    ) {
+        decision = ReviewDecision.MAYBE;
+    }
+
+    reviews.push({
+        id: "" + i,
+        userId: "" + getRandomItems(USERS)[0].id,
path: src/data/standardData.ts
user: login: Slartibartfass2
body: 🦺 
```suggestion
        id: `${i}`,
        userId: `${getRandomItems(USERS)[0].id}`,
```
created_at: 2025-03-07T08:48:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
+    const selectedCriteria = getRandomItems(CRITERIA, 2, 4);
+    let decision = ReviewDecision.ACCEPTED;
+    if (
+        selectedCriteria.filter(
+            (criterion) => criterion.category === CriterionCategory.HARD_EXCLUSION,
+        ).length > 0
+    ) {
+        decision = ReviewDecision.DECLINED;
+    } else if (
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.EXCLUSION)
+            .length > 0 &&
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.INCLUSION)
+            .length > 0
+    ) {
+        decision = ReviewDecision.MAYBE;
+    }
+
+    reviews.push({
+        id: "" + i,
+        userId: "" + getRandomItems(USERS)[0].id,
+        decision: decision,
+        selectedCriteriaIds: selectedCriteria.map((criterion) => criterion.id),
+    });
+}
+
+const projectPapers: Project_Paper[] = [];
+for (const [index, paper] of papers.entries()) {
+    const reviewsOfPaper = Math.random() < 0.5 ? getRandomItems(reviews, 1, 3) : [];
+
+    let decision = PaperDecision.UNSPECIFIED;
path: src/data/standardData.ts
user: login: Slartibartfass2
body: Minor: this default value is never used.
```suggestion
    let decision;
```
created_at: 2025-03-07T08:50:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
+    const selectedCriteria = getRandomItems(CRITERIA, 2, 4);
+    let decision = ReviewDecision.ACCEPTED;
+    if (
+        selectedCriteria.filter(
+            (criterion) => criterion.category === CriterionCategory.HARD_EXCLUSION,
+        ).length > 0
+    ) {
+        decision = ReviewDecision.DECLINED;
+    } else if (
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.EXCLUSION)
+            .length > 0 &&
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.INCLUSION)
+            .length > 0
+    ) {
+        decision = ReviewDecision.MAYBE;
+    }
+
+    reviews.push({
+        id: "" + i,
+        userId: "" + getRandomItems(USERS)[0].id,
+        decision: decision,
+        selectedCriteriaIds: selectedCriteria.map((criterion) => criterion.id),
+    });
+}
+
+const projectPapers: Project_Paper[] = [];
+for (const [index, paper] of papers.entries()) {
+    const reviewsOfPaper = Math.random() < 0.5 ? getRandomItems(reviews, 1, 3) : [];
+
+    let decision = PaperDecision.UNSPECIFIED;
+    if (reviewsOfPaper.length === 0 || Math.random() < 0.2) {
+        decision = PaperDecision.UNDECIDED;
+    } else if (
+        reviewsOfPaper.filter((review) => review.decision === ReviewDecision.ACCEPTED).length >
+        reviewsOfPaper.filter((review) => review.decision === ReviewDecision.DECLINED).length
+    ) {
+        decision = PaperDecision.ACCEPTED;
+    } else {
+        decision = PaperDecision.DECLINED;
+    }
+    projectPapers.push({
+        id: "" + index,
path: src/data/standardData.ts
user: login: Slartibartfass2
body: 🐞 
```suggestion
        id: `${index}`
```
created_at: 2025-03-07T08:50:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
+
+// Check, whether the dummy admin user should be added or not
+if (isOptionEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
+    LOG.warn("Security Risk: dummy admin user enabled!");
+    USERS.set("admin@admin", {
+        id: "admin@admin",
+        email: "admin@admin",
+        firstName: "admin",
+        lastName: "admin",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+        password: "admin",
+        accessToken: "admin",
+        refreshToken: "admin",
+    });
+    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+}
+
+// Check, whether a filepath to a file containing example data for the mock backend is set
+if (process.env.EXAMPLE_DATA_FILE !== undefined && process.env.EXAMPLE_DATA_FILE !== "") {
+    loadExampleData(process.env.EXAMPLE_DATA_FILE);
+}
path: src/main.ts
user: login: Slartibartfass2
body: Optional: you could also use the following AFAIK
```suggestion
if (!process.env.EXAMPLE_DATA_FILE) {
    loadExampleData(process.env.EXAMPLE_DATA_FILE);
}
```
created_at: 2025-03-07T08:51:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
path: src/main.ts
user: login: Slartibartfass2
body: Is there a reason why you put this inside this file?
created_at: 2025-03-07T08:53:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
path: src/model.ts
user: login: Slartibartfass2
body: Isn't this part of the example data?
created_at: 2025-03-07T08:55:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
path: src/model.ts
user: login: Slartibartfass2
body: This seems like something we want to set in `standardData.ts`. `USER_SETTINGS` as well.
created_at: 2025-03-07T08:59:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
path: src/model.ts
user: login: Slartibartfass2
body: If you change the type of the `list` argument from `T[]` to `Iterable<T>`, you can directly use `PAPERS.values()`. There are some other cases where this applies.
created_at: 2025-03-07T09:02:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
path: src/model.ts
user: login: Slartibartfass2
body: Is there a reason for the sorting?
created_at: 2025-03-07T09:07:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
path: src/model.ts
user: login: Slartibartfass2
body: Unnecessary nesting
```suggestion
        getRandomItems(data.projectPapers ?? [], 25, 40)
```
created_at: 2025-03-07T09:07:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
+            .filter((paper) => paper.stage <= project.maxStage)
+            .map((paper) => ({ ...paper, id: project.id + "-" + paper.id }))
path: src/model.ts
user: login: Slartibartfass2
body: Use string interpolation ([`typescript:S3512`](https://rules.sonarsource.com/typescript/impact/maintainability/RSPEC-3512/))
```suggestion
            .map((paper) => ({ ...paper, id: `${project.id}-${paper.id}` }))
```
created_at: 2025-03-07T09:09:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
+            .filter((paper) => paper.stage <= project.maxStage)
+            .map((paper) => ({ ...paper, id: project.id + "-" + paper.id }))
+            .forEach((paper: Project_Paper) => {
+                PROJECT_PAPERS.set(paper.id, paper);
+                PROJECT_PROJECT_PAPERS.get(project.id)?.push(paper.id);
+
+                // add paper reviews in separate PAPER_REVIEWS map
+                PAPER_REVIEWS.set(
+                    paper.id,
+                    paper.reviews.map((review) => review.id),
+                );
+            });
+
+        // set the progress of the project
+        PROGRESS.set(
+            project.id,
+            ((PROJECT_PROJECT_PAPERS.get(project.id)
+                ?.map((id) => PROJECT_PAPERS.get(id))
+                .filter(
+                    (paper) =>
+                        paper !== undefined &&
+                        paper.stage === project.currentStage &&
+                        paper.decision !== PaperDecision.UNDECIDED,
+                ).length ?? 0) *
+                100) /
+                (PROJECT_PROJECT_PAPERS.get(project.id)?.length ?? Infinity),
path: src/model.ts
user: login: Slartibartfass2
body: This part is a bit challenging to read. Can we refactor this?
created_at: 2025-03-07T09:14:30Z
author_association: CONTRIBUTOR
path: src/model.ts
user: login: Slartibartfass2
body: There are some parts in `processExampleData` that affect the resulting mock data, which I would've rather expected in the example data itself. What are your thoughts on this?
created_at: 2025-03-07T09:16:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
path: src/service.ts
user: login: Slartibartfass2
body: Is there a reason why we don't use the identity check?
```suggestion
        if (user.password !== oldPassword) {
```
There are many other cases in this file where this applies too. Just search for `==` and `!=`.
created_at: 2025-03-07T09:18:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
             callback({
                 code: status.UNAUTHENTICATED,
                 details: "The old password is incorrect",
             });
+            return;
+        } else {
+            USERS.get(user.email)!.password = newPassword;
+            callback(null, {});
         }
path: src/service.ts
user: login: Slartibartfass2
body: This `return` is redundant if you use the `else` block. Here and the other changes you made.
What about a correct guard clause?
```suggestion
            return;
        }

        USERS.get(user.email)!.password = newPassword;
        callback(null, {});
```
created_at: 2025-03-07T09:21:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -735,28 +738,30 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Criterion>,
     ): void {
         const { id } = call.request;
-        if (CRITERIA.has(id)) {
-            callback(null, CRITERIA.get(id)!);
-        } else {
+        if (!CRITERIA.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Criterion not found",
+                details: "Criterion with the given id was not found",
             });
+            return;
+        } else {
+            callback(null, CRITERIA.get(id)!);
path: src/service.ts
user: login: Slartibartfass2
body: The `!` is not required. There are many cases where this applies. Basically, everywhere where a nullable value is passed to `callback`. `callback` doesn't care whether it's null/undefined or not.
created_at: 2025-03-07T09:29:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -888,13 +901,8 @@ export const snowballRService: ISnowballR = {
             PROJECT_PAPERS.set(id, project_paper);
             PAPER_REVIEWS.set(id, []);
             PROJECT_PROJECT_PAPERS.get(projectId)!.push(id);
-            PROGRESS.set(projectId, Math.min(PROGRESS.get(projectId) || 0 + 0.05, 1.0));
+            PROGRESS.set(projectId, Math.min((PROGRESS.get(projectId) || 0) + 0.05, 1.0));
path: src/service.ts
user: login: Slartibartfass2
body: Prefer using nullish coalescing operator (`??`) instead of a logical or (`||`), as it is a safer operator. ([`typescript:S6606`](https://rules.sonarsource.com/typescript/impact/maintainability/RSPEC-3512))
```suggestion
            PROGRESS.set(projectId, Math.min((PROGRESS.get(projectId) ?? 0) + 0.05, 1.0));
```
created_at: 2025-03-07T09:33:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,13 +1,48 @@
 import { Metadata } from "@grpc/grpc-js";
-import { ServerUser, USERS } from "./model";
+import { PAPER_REVIEWS, REVIEWS, ServerProjectPaper, ServerUser, USERS } from "./model";
 import { User } from "./grpc-gen/user";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
+import { LoginSecret } from "./grpc-gen/authentication";
+import { Project_Paper } from "./grpc-gen/project";
 
+/**
+ * Checks whether a string is the empty string
path: src/util.ts
user: login: Slartibartfass2
body: ```suggestion
 * Checks whether a string is empty
```
created_at: 2025-03-07T09:39:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,13 +1,48 @@
 import { Metadata } from "@grpc/grpc-js";
-import { ServerUser, USERS } from "./model";
+import { PAPER_REVIEWS, REVIEWS, ServerProjectPaper, ServerUser, USERS } from "./model";
 import { User } from "./grpc-gen/user";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
+import { LoginSecret } from "./grpc-gen/authentication";
+import { Project_Paper } from "./grpc-gen/project";
 
+/**
+ * Checks whether a string is the empty string
+ *
+ * @param string the string to check against the empty string
+ * @return true, if the string is empty or null, otherwise false
+ */
 export function isEmpty(string: string | null): boolean {
     if (string == null) return true;
     else return string.trim().length == 0;
 }
 
+/**
+ * Select a random items from a list. The number of items to be selected
+ * is randomly chosen from a value between the minimum and maximum number.
+ * The default minimum or maximum number is 1, so if only the list is given,
+ * only on random item is selected.
+ *
+ * If the number of items to be chosen is greater that the number of items in the list,
+ * the entire list is returned
+ *
+ * @param list the list the items are randomly selected of
path: src/util.ts
user: login: Slartibartfass2
body: ```suggestion
 * Select random items from a list. The number of items to be selected
 * is randomly chosen from a value between the minimum and maximum number.
 * The default minimum and maximum number is 1, so if only the list is given,
 * only one random item is selected.
 *
 * If the number of items to be chosen is greater that the number of items in the list,
 * the entire list is returned
 *
 * @param list the list from which items are randomly selected
```
created_at: 2025-03-07T09:42:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -26,12 +64,46 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
path: src/util.ts
user: login: Slartibartfass2
body: Please add a comment why you commented this code.
created_at: 2025-03-07T09:45:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -26,12 +64,46 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
     if (authorization.trim() == "") return null;
-    return findFirst(USERS.values(), "accessToken", authorization);
+    return findFirst(USERS.values(), "accessToken", authorization);*/
+    return USERS.get("alice.smith@example.com")!;
+}
+
+/**
+ * Converts a user into a server user, so the user information are extended by the password and tokens
+ * of the user.
+ *
+ * @param user the user object to be extended
+ * @param password the password of the user
+ * @param loginSecret the login secret, so the authorization and refresh tokens of the user
+ * @return the server user created from the user, password and login secret
+ */
+export function fromUser(user: User, password: string, loginSecret: LoginSecret): ServerUser {
path: src/util.ts
user: login: Slartibartfass2
body: What about `toServerUser`? As this isn't an extension method, it would be confusing.
```suggestion
export function toServerUser(user: User, password: string, loginSecret: LoginSecret): ServerUser {
```
created_at: 2025-03-07T09:48:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -26,12 +64,46 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
     if (authorization.trim() == "") return null;
-    return findFirst(USERS.values(), "accessToken", authorization);
+    return findFirst(USERS.values(), "accessToken", authorization);*/
+    return USERS.get("alice.smith@example.com")!;
+}
+
+/**
+ * Converts a user into a server user, so the user information are extended by the password and tokens
+ * of the user.
+ *
+ * @param user the user object to be extended
+ * @param password the password of the user
+ * @param loginSecret the login secret, so the authorization and refresh tokens of the user
+ * @return the server user created from the user, password and login secret
+ */
+export function fromUser(user: User, password: string, loginSecret: LoginSecret): ServerUser {
+    return {
+        id: user.id,
+        email: user.email,
+        firstName: user.firstName,
+        lastName: user.lastName,
+        role: user.role,
+        status: user.status,
+        password: password,
+        accessToken: loginSecret.accessToken,
+        refreshToken: loginSecret.refreshToken,
path: src/util.ts
user: login: Slartibartfass2
body: Optional alternative:
```suggestion
        ...user,
        ...loginSecret,
        password,
```
(also creates some sort of type-safety, when one of the types change)
created_at: 2025-03-07T09:49:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
path: src/service.ts
user: login: Slartibartfass2
body: I noticed this throughout the repo. Was there a reason for this?
created_at: 2025-03-07T10:01:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -53,25 +139,68 @@ export function findFirst<T, K extends keyof T, V extends T[K]>(
             return object;
         }
     }
-
     return null;
 }
 
+/**
+ * Generates the next id.
+ *
+ * @param objs the map of already exist elements with ids
+ * @return the next available id
+ */
+export function getNextId<T extends Map<string, V>, V>(objs: T): string {
+    let i = objs.size;
+    while (objs.has(i.toString())) {
+        i++;
+    }
+    return i.toString();
+}
+
+/**
+ * Adds review details to a project paper.
+ *
+ * @param paper the project paper to extend with review information
+ * @return the new project paper with an added 'reviews' array populated from the associated reviews
+ */
+export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
+    return {
+        ...paper,
+        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
+    };
+}
+
+/**
+ * Checks if any property in an object (including nested objects) is undefined.
+ *
+ * @param obj the object to check
+ * @returns true if any property (or sub-property) is undefined, otherwise false
+ */
 export function anythingUndefined<T extends object>(obj: T): boolean {
     return Object.values(obj).some((v) => {
         return v == undefined || (typeof v === "object" && anythingUndefined(v));
     });
 }
 
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export function isSnowballRService(methodDescriptor: ServerMethodDefinition<any, any>): boolean {
-    return methodDescriptor.path.startsWith("/snowballr.SnowballR/");
-}
-
-export function getNextId<T extends Map<string, V>, V>(objs: T): string {
-    let i = objs.size;
-    while (objs.has(i.toString())) {
-        i++;
+/**
+ * Checks whether the given string indicates that an option is enabled.
+ * An option is considered as enabled, if it is set to either:
+ * - 1
+ * - (y/Y)es
+ * - (t/T)rue
+ *
+ * @param option the input to check
+ * @return true, if the given option is set to value listed above, otherwise false
+ */
+export function isOptionEnabled(option?: string): boolean {
+    option = option?.toLowerCase() ?? "";
+    switch (option) {
+        case "1":
+        case "yes":
+        case "Yes":
+        case "true":
+        case "True":
+            return true;
+        default:
+            return false;
path: src/util.ts
user: login: Slartibartfass2
body: The cases `Yes` and `True` are not reachable as you do `toLowerCase`.
```suggestion
    option = option?.toLowerCase() ?? "";
    switch (option) {
        case "1":
        case "yes":
        case "true":
            return true;
        default:
            return false;
```
This could also be `return ["1", "yes", "true"].include(option);`

created_at: 2025-03-07T10:02:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
path: README.md
user: login: Merseleo
body: You are right, forgot to adapt this.
created_at: 2025-03-08T10:38:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
path: README.md
user: login: Merseleo
body: Removed it.
created_at: 2025-03-08T10:39:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
+```
+
 ### Configuration
 
 A boolean variable may be enabled by setting it to either `1`, `yes`, or `true`.
 
-| Environment Variable | Default | Description                                                                                   |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------- |
-| `GRPC_PORT`          | 3000    | The port the native server should listen on                                                   |
-| `GRPC_WEB_PORT`      | 3001    | The port the gRPC web proxy should listen on                                                  |
-| `ENABLE_DUMMY_ADMIN` | false   | Whether or not to enable a dummy admin user                                                   |
-| `LOG_LEVEL`          | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`. |
+| Environment Variable     | Default | Description                                                                                                          |
+| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------- |
+| `GRPC_PORT`              | 3000    | The port the native server should listen on                                                                          |
+| `GRPC_WEB_PORT`          | 3001    | The port the gRPC web proxy should listen on                                                                         |
+| `ENABLE_DUMMY_ADMIN`     | false   | Whether or not to enable a dummy admin user                                                                          |
path: README.md
user: login: Merseleo
body: I guess I wasn't attentive enough during Luca's review ...
created_at: 2025-03-08T10:40:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
+```
+
 ### Configuration
 
 A boolean variable may be enabled by setting it to either `1`, `yes`, or `true`.
 
-| Environment Variable | Default | Description                                                                                   |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------- |
-| `GRPC_PORT`          | 3000    | The port the native server should listen on                                                   |
-| `GRPC_WEB_PORT`      | 3001    | The port the gRPC web proxy should listen on                                                  |
-| `ENABLE_DUMMY_ADMIN` | false   | Whether or not to enable a dummy admin user                                                   |
-| `LOG_LEVEL`          | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`. |
+| Environment Variable     | Default | Description                                                                                                          |
+| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------- |
+| `GRPC_PORT`              | 3000    | The port the native server should listen on                                                                          |
+| `GRPC_WEB_PORT`          | 3001    | The port the gRPC web proxy should listen on                                                                         |
+| `ENABLE_DUMMY_ADMIN`     | false   | Whether or not to enable a dummy admin user                                                                          |
+| `LOG_LEVEL`              | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`.                        |
+| `EXAMPLE_DATA_FILE_PATH` | ""      | Relative or absolute filepath to a file containing example data for the mock backend (e.g. ./data/standardData.json) |
path: README.md
user: login: Merseleo
body: No you are right, all in all I think I forgot to push some changes, because I remember to fixed this old README. But I will change it!
created_at: 2025-03-08T10:42:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -27,19 +27,34 @@ npm run start
 ```
 
 If connecting from a gRPC web client, the `GRPC_WEB_PORT` endpoint must be
-targeted. If using a native client like `grpcui` or `grpcurl`, conecting to
+targeted. If using a native client like `grpcui` or `grpcurl`, connecting to
 `GRPC_PORT` is required.
 
+If you're not going to use the mock backend for automated tests, but only to manually check the frontend functionality, it's useful to have some initial data.
+You can start the mock backend with initial data for this purpose, whereas these initial data must be saved in a typescript file.
+This file must be located in the [data/](src/data) directory. The data in this file is then imported and,
+if it is correct, saved as initial data in a "database" with which the mock backend is started.
+The file is considered to be correct, if it exports an object named `exampleData` conforming the `ExampleData` interface, e.g.
+
+```typescript
+export const exampleData: ExampleData = {
+    users: users,
+    ...
+};
+
+```
+
 ### Configuration
 
 A boolean variable may be enabled by setting it to either `1`, `yes`, or `true`.
 
-| Environment Variable | Default | Description                                                                                   |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------- |
-| `GRPC_PORT`          | 3000    | The port the native server should listen on                                                   |
-| `GRPC_WEB_PORT`      | 3001    | The port the gRPC web proxy should listen on                                                  |
-| `ENABLE_DUMMY_ADMIN` | false   | Whether or not to enable a dummy admin user                                                   |
-| `LOG_LEVEL`          | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`. |
+| Environment Variable     | Default | Description                                                                                                          |
+| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------- |
+| `GRPC_PORT`              | 3000    | The port the native server should listen on                                                                          |
+| `GRPC_WEB_PORT`          | 3001    | The port the gRPC web proxy should listen on                                                                         |
+| `ENABLE_DUMMY_ADMIN`     | false   | Whether or not to enable a dummy admin user                                                                          |
+| `LOG_LEVEL`              | `debug` | The log level to use. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace`, or `silent`.                        |
+| `EXAMPLE_DATA_FILE_PATH` | ""      | Relative or absolute filepath to a file containing example data for the mock backend (e.g. ./data/standardData.json) |
path: README.md
user: login: Merseleo
body: Regarding your second point. I would work around this problem by saying that the file simply has to be in the data/ directory.
created_at: 2025-03-08T10:44:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
path: src/data/standardData.ts
user: login: Merseleo
body: I agree that your solution looks cleaner.
created_at: 2025-03-08T10:45:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
path: src/main.ts
user: login: Merseleo
body: Because I prefer to have all environment variable parsing in one file and imo the best file for this parsing is the main.ts and so I moved it here. Do you want to move it back?
created_at: 2025-03-08T10:47:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,13 +1,48 @@
 import { Metadata } from "@grpc/grpc-js";
-import { ServerUser, USERS } from "./model";
+import { PAPER_REVIEWS, REVIEWS, ServerProjectPaper, ServerUser, USERS } from "./model";
 import { User } from "./grpc-gen/user";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
+import { LoginSecret } from "./grpc-gen/authentication";
+import { Project_Paper } from "./grpc-gen/project";
 
+/**
+ * Checks whether a string is the empty string
path: src/util.ts
user: login: Merseleo
body: Changed.
created_at: 2025-03-08T10:49:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,13 +1,48 @@
 import { Metadata } from "@grpc/grpc-js";
-import { ServerUser, USERS } from "./model";
+import { PAPER_REVIEWS, REVIEWS, ServerProjectPaper, ServerUser, USERS } from "./model";
 import { User } from "./grpc-gen/user";
 import { ServerMethodDefinition } from "@grpc/grpc-js/build/src/make-client";
+import { LoginSecret } from "./grpc-gen/authentication";
+import { Project_Paper } from "./grpc-gen/project";
 
+/**
+ * Checks whether a string is the empty string
+ *
+ * @param string the string to check against the empty string
+ * @return true, if the string is empty or null, otherwise false
+ */
 export function isEmpty(string: string | null): boolean {
     if (string == null) return true;
     else return string.trim().length == 0;
 }
 
+/**
+ * Select a random items from a list. The number of items to be selected
+ * is randomly chosen from a value between the minimum and maximum number.
+ * The default minimum or maximum number is 1, so if only the list is given,
+ * only on random item is selected.
+ *
+ * If the number of items to be chosen is greater that the number of items in the list,
+ * the entire list is returned
+ *
+ * @param list the list the items are randomly selected of
path: src/util.ts
user: login: Merseleo
body: Changed.
created_at: 2025-03-08T10:50:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -26,12 +64,46 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
path: src/util.ts
user: login: Merseleo
body: I extended the comment with a second section and wrote @luca-schlecker, so can remove this comment and constant return as soon as the authentication is completed in the frontend.
created_at: 2025-03-08T11:09:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
+
+// Check, whether the dummy admin user should be added or not
+if (isOptionEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
+    LOG.warn("Security Risk: dummy admin user enabled!");
+    USERS.set("admin@admin", {
+        id: "admin@admin",
+        email: "admin@admin",
+        firstName: "admin",
+        lastName: "admin",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+        password: "admin",
+        accessToken: "admin",
+        refreshToken: "admin",
+    });
+    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+}
+
+// Check, whether a filepath to a file containing example data for the mock backend is set
+if (process.env.EXAMPLE_DATA_FILE !== undefined && process.env.EXAMPLE_DATA_FILE !== "") {
+    loadExampleData(process.env.EXAMPLE_DATA_FILE);
+}
path: src/main.ts
user: login: Merseleo
body: Without the ! you are correct, I can shorten it. Because your solution would load the example data, if the file path is a falsy value like undefined. But I shorten it.
created_at: 2025-03-08T15:31:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Merseleo
body: i understand your argument, but I wanted to keep the example data as close as possible to the real database or backend and i thought this is the format the review decision matrix is stored? Or do we want to restructure it and store only the number per decision type in general as you suggested. Imo a good solution too.
created_at: 2025-03-08T15:34:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
path: src/data/standardData.ts
user: login: Merseleo
body: Is this really necessary for a mock backend? And I think I added only pattern, whose random combinations should be exhaustive or do you have an example of a reviewDecisionMatrix which could be generated that would be problematic?
created_at: 2025-03-08T15:37:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
path: src/data/standardData.ts
user: login: Merseleo
body: I can add these checks, but imo we should not over engineer the mock backend.
created_at: 2025-03-08T15:38:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
path: src/data/standardData.ts
user: login: Merseleo
body: I already had the same idea, but wasn't sure whether this is really advantageous, but as you had the same idea, I will add this.
created_at: 2025-03-08T15:49:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
+    const selectedCriteria = getRandomItems(CRITERIA, 2, 4);
+    let decision = ReviewDecision.ACCEPTED;
+    if (
+        selectedCriteria.filter(
+            (criterion) => criterion.category === CriterionCategory.HARD_EXCLUSION,
+        ).length > 0
+    ) {
+        decision = ReviewDecision.DECLINED;
+    } else if (
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.EXCLUSION)
+            .length > 0 &&
+        selectedCriteria.filter((criterion) => criterion.category === CriterionCategory.INCLUSION)
+            .length > 0
+    ) {
+        decision = ReviewDecision.MAYBE;
+    }
+
+    reviews.push({
+        id: "" + i,
+        userId: "" + getRandomItems(USERS)[0].id,
+        decision: decision,
+        selectedCriteriaIds: selectedCriteria.map((criterion) => criterion.id),
+    });
+}
+
+const projectPapers: Project_Paper[] = [];
+for (const [index, paper] of papers.entries()) {
+    const reviewsOfPaper = Math.random() < 0.5 ? getRandomItems(reviews, 1, 3) : [];
+
+    let decision = PaperDecision.UNSPECIFIED;
path: src/data/standardData.ts
user: login: Merseleo
body: You are right, I forgot to delete this when adding the else case.
created_at: 2025-03-08T15:51:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -26,12 +64,46 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
     if (authorization.trim() == "") return null;
-    return findFirst(USERS.values(), "accessToken", authorization);
+    return findFirst(USERS.values(), "accessToken", authorization);*/
+    return USERS.get("alice.smith@example.com")!;
+}
+
+/**
+ * Converts a user into a server user, so the user information are extended by the password and tokens
+ * of the user.
+ *
+ * @param user the user object to be extended
+ * @param password the password of the user
+ * @param loginSecret the login secret, so the authorization and refresh tokens of the user
+ * @return the server user created from the user, password and login secret
+ */
+export function fromUser(user: User, password: string, loginSecret: LoginSecret): ServerUser {
path: src/util.ts
user: login: Merseleo
body: Good idea.
created_at: 2025-03-08T15:52:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -26,12 +64,46 @@ export function randomToken(): string {
     return token;
 }
 
+/**
+ * Search for the (server) user with the provided "Authorization" token.
+ *
+ * @param metadata the request metadata (= header) containing the "Authorization" header
+ * @return the server user with the given access token or null, if no server user was found
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 export function getAuthenticated(metadata: Metadata): ServerUser | null {
-    const authorization = metadata.get("Authorization").join("");
+    /*const authorization = metadata.get("Authorization").join("");
     if (authorization.trim() == "") return null;
-    return findFirst(USERS.values(), "accessToken", authorization);
+    return findFirst(USERS.values(), "accessToken", authorization);*/
+    return USERS.get("alice.smith@example.com")!;
+}
+
+/**
+ * Converts a user into a server user, so the user information are extended by the password and tokens
+ * of the user.
+ *
+ * @param user the user object to be extended
+ * @param password the password of the user
+ * @param loginSecret the login secret, so the authorization and refresh tokens of the user
+ * @return the server user created from the user, password and login secret
+ */
+export function fromUser(user: User, password: string, loginSecret: LoginSecret): ServerUser {
+    return {
+        id: user.id,
+        email: user.email,
+        firstName: user.firstName,
+        lastName: user.lastName,
+        role: user.role,
+        status: user.status,
+        password: password,
+        accessToken: loginSecret.accessToken,
+        refreshToken: loginSecret.refreshToken,
path: src/util.ts
user: login: Merseleo
body: I really must get more familiar with the spread operator.
created_at: 2025-03-08T15:54:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -53,25 +139,68 @@ export function findFirst<T, K extends keyof T, V extends T[K]>(
             return object;
         }
     }
-
     return null;
 }
 
+/**
+ * Generates the next id.
+ *
+ * @param objs the map of already exist elements with ids
+ * @return the next available id
+ */
+export function getNextId<T extends Map<string, V>, V>(objs: T): string {
+    let i = objs.size;
+    while (objs.has(i.toString())) {
+        i++;
+    }
+    return i.toString();
+}
+
+/**
+ * Adds review details to a project paper.
+ *
+ * @param paper the project paper to extend with review information
+ * @return the new project paper with an added 'reviews' array populated from the associated reviews
+ */
+export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
+    return {
+        ...paper,
+        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
+    };
+}
+
+/**
+ * Checks if any property in an object (including nested objects) is undefined.
+ *
+ * @param obj the object to check
+ * @returns true if any property (or sub-property) is undefined, otherwise false
+ */
 export function anythingUndefined<T extends object>(obj: T): boolean {
     return Object.values(obj).some((v) => {
         return v == undefined || (typeof v === "object" && anythingUndefined(v));
     });
 }
 
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export function isSnowballRService(methodDescriptor: ServerMethodDefinition<any, any>): boolean {
-    return methodDescriptor.path.startsWith("/snowballr.SnowballR/");
-}
-
-export function getNextId<T extends Map<string, V>, V>(objs: T): string {
-    let i = objs.size;
-    while (objs.has(i.toString())) {
-        i++;
+/**
+ * Checks whether the given string indicates that an option is enabled.
+ * An option is considered as enabled, if it is set to either:
+ * - 1
+ * - (y/Y)es
+ * - (t/T)rue
+ *
+ * @param option the input to check
+ * @return true, if the given option is set to value listed above, otherwise false
+ */
+export function isOptionEnabled(option?: string): boolean {
+    option = option?.toLowerCase() ?? "";
+    switch (option) {
+        case "1":
+        case "yes":
+        case "Yes":
+        case "true":
+        case "True":
+            return true;
+        default:
+            return false;
path: src/util.ts
user: login: Merseleo
body: You are right, I will shorten this method. Thank you for the hint.
created_at: 2025-03-08T15:55:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
path: src/service.ts
user: login: Merseleo
body: Because I already provided Luca this feedback, but we wanted to keep the less strict check, I do not really know why. However, it should work this way too, so do you really need to change?
created_at: 2025-03-08T15:57:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -888,13 +901,8 @@ export const snowballRService: ISnowballR = {
             PROJECT_PAPERS.set(id, project_paper);
             PAPER_REVIEWS.set(id, []);
             PROJECT_PROJECT_PAPERS.get(projectId)!.push(id);
-            PROGRESS.set(projectId, Math.min(PROGRESS.get(projectId) || 0 + 0.05, 1.0));
+            PROGRESS.set(projectId, Math.min((PROGRESS.get(projectId) || 0) + 0.05, 1.0));
path: src/service.ts
user: login: Merseleo
body: I knew, this looked weird to me as Luca introduced this line ...
created_at: 2025-03-08T16:00:28Z
author_association: CONTRIBUTOR
path: src/model.ts
user: login: Merseleo
body: Yes, again I already had the same thought, but it was easier and quicker this way and I wanted to first get your feedback. But as we are not two with the same opinion I will change it.
created_at: 2025-03-08T16:03:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
path: src/model.ts
user: login: Merseleo
body: My mistake, forgot that I added it the example data already.
created_at: 2025-03-08T16:05:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
path: src/model.ts
user: login: Merseleo
body: Ah didn't know this, good to know. I will integrate it.
created_at: 2025-03-08T16:08:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
path: src/model.ts
user: login: Merseleo
body: Deleted it.
created_at: 2025-03-08T16:10:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
path: src/model.ts
user: login: Merseleo
body: I will move this into the `standardData.ts` file.
created_at: 2025-03-08T17:52:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
path: src/model.ts
user: login: Merseleo
body: No, first I thought this is necessary for the correct ordering of the criteria on the "Review information" tab, but it isn't. 
created_at: 2025-03-08T17:57:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
+            .filter((paper) => paper.stage <= project.maxStage)
+            .map((paper) => ({ ...paper, id: project.id + "-" + paper.id }))
+            .forEach((paper: Project_Paper) => {
+                PROJECT_PAPERS.set(paper.id, paper);
+                PROJECT_PROJECT_PAPERS.get(project.id)?.push(paper.id);
+
+                // add paper reviews in separate PAPER_REVIEWS map
+                PAPER_REVIEWS.set(
+                    paper.id,
+                    paper.reviews.map((review) => review.id),
+                );
+            });
+
+        // set the progress of the project
+        PROGRESS.set(
+            project.id,
+            ((PROJECT_PROJECT_PAPERS.get(project.id)
+                ?.map((id) => PROJECT_PAPERS.get(id))
+                .filter(
+                    (paper) =>
+                        paper !== undefined &&
+                        paper.stage === project.currentStage &&
+                        paper.decision !== PaperDecision.UNDECIDED,
+                ).length ?? 0) *
+                100) /
+                (PROJECT_PROJECT_PAPERS.get(project.id)?.length ?? Infinity),
path: src/model.ts
user: login: Merseleo
body: We can ...
created_at: 2025-03-08T18:04:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
+            .filter((paper) => paper.stage <= project.maxStage)
+            .map((paper) => ({ ...paper, id: project.id + "-" + paper.id }))
+            .forEach((paper: Project_Paper) => {
+                PROJECT_PAPERS.set(paper.id, paper);
+                PROJECT_PROJECT_PAPERS.get(project.id)?.push(paper.id);
+
+                // add paper reviews in separate PAPER_REVIEWS map
+                PAPER_REVIEWS.set(
+                    paper.id,
+                    paper.reviews.map((review) => review.id),
+                );
+            });
+
+        // set the progress of the project
+        PROGRESS.set(
+            project.id,
+            ((PROJECT_PROJECT_PAPERS.get(project.id)
+                ?.map((id) => PROJECT_PAPERS.get(id))
+                .filter(
+                    (paper) =>
+                        paper !== undefined &&
+                        paper.stage === project.currentStage &&
+                        paper.decision !== PaperDecision.UNDECIDED,
+                ).length ?? 0) *
+                100) /
+                (PROJECT_PROJECT_PAPERS.get(project.id)?.length ?? Infinity),
path: src/model.ts
user: login: Merseleo
body: Does the change improved the readability?
created_at: 2025-03-10T08:19:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
             callback({
                 code: status.UNAUTHENTICATED,
                 details: "The old password is incorrect",
             });
+            return;
+        } else {
+            USERS.get(user.email)!.password = newPassword;
+            callback(null, {});
         }
path: src/service.ts
user: login: Merseleo
body: I can correct this.
created_at: 2025-03-10T08:37:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -735,28 +738,30 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Criterion>,
     ): void {
         const { id } = call.request;
-        if (CRITERIA.has(id)) {
-            callback(null, CRITERIA.get(id)!);
-        } else {
+        if (!CRITERIA.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Criterion not found",
+                details: "Criterion with the given id was not found",
             });
+            return;
+        } else {
+            callback(null, CRITERIA.get(id)!);
path: src/service.ts
user: login: Merseleo
body: Didn't know this, otherwise I would have made the same comment in Luca's review, but I just read the documentation and you are right.
created_at: 2025-03-10T08:39:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -735,28 +738,30 @@ export const snowballRService: ISnowballR = {
         callback: sendUnaryData<Criterion>,
     ): void {
         const { id } = call.request;
-        if (CRITERIA.has(id)) {
-            callback(null, CRITERIA.get(id)!);
-        } else {
+        if (!CRITERIA.has(id)) {
             callback({
                 code: status.NOT_FOUND,
-                details: "Criterion not found",
+                details: "Criterion with the given id was not found",
             });
+            return;
+        } else {
+            callback(null, CRITERIA.get(id)!);
path: src/service.ts
user: login: Merseleo
body: I hope I dont forget anything now.
created_at: 2025-03-10T08:39:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Slartibartfass2
body: Yes, this was a general idea for the API spec. It wouldn't make sense to store a list of decisions, if we need to count them, either way.

So no need to change anything here. I just wanted to discuss this.
created_at: 2025-03-10T10:52:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Slartibartfass2
body: I added an issue for that.
created_at: 2025-03-10T10:57:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
path: src/data/standardData.ts
user: login: Slartibartfass2
body: If you take entry 3 and 4 of `PATTERN_3`, you won't be able to get an accepted decision, or am I overlooking something?
Is there a fallback case?
created_at: 2025-03-10T11:01:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
+
+const projectSettings: Project_Settings[] = [];
+for (let i = 0; i < 7; i++) {
+    projectSettings.push({
+        similarityThreshold: Math.random() * 0.2 + 0.5,
+        decisionMatrix: getRandomItems(reviewDecisionMatrices)[0],
+        fetcherApis: getRandomItems(AVAILABLE_FETCHERS, 2, 7),
+        snowballingType:
+            Math.random() < 0.7
+                ? SnowballingType.BOTH
+                : Math.random() < 0.5
+                  ? SnowballingType.FORWARD
+                  : SnowballingType.BACKWARD,
+        reviewMaybeAllowed: Math.random() < 0.7,
+    });
+}
+
+const projects: Project[] = [];
+const PROJECT_NAMES = [
+    "Innovative Survey for Education",
+    "Systematic Study in Healthcare",
+    "Comprehensive Review of Sustainability",
+    "Dynamic Analysis for Automation",
+    "Focused Protocol on AI",
+    "Recent Investigation in Robotics",
+    "Critical Framework on Climate Change",
+    "Combinatorial Study for Education",
+    "Global Survey of Sustainability",
+    "Efficient Review on AI",
+    "Innovative Methodology in Bioinformatics",
+    "Comprehensive Framework for Automation",
+    "Dynamic Assessment on Data Privacy",
+    "Recent Approach in Robotics",
+    "Systematic Investigation for Education",
+    "Combinatorial Review on Climate Change",
+    "Global Study for Bioinformatics",
+    "Focused Protocol on Sustainability",
+    "Critical Approach for Automation",
+    "Efficient Review in Healthcare",
+];
+for (const [index, projectName] of PROJECT_NAMES.entries()) {
+    const stage: number = Math.floor(Math.random() * 2.5);
+
+    projects.push({
+        id: "" + index,
+        name: projectName,
+        status:
+            Math.random() < 0.7
+                ? ProjectStatus.ACTIVE
+                : Math.random() < 0.5
+                  ? ProjectStatus.ARCHIVED
+                  : ProjectStatus.DELETED,
+        currentStage: BigInt(stage),
+        maxStage: BigInt(Math.random() < 0.6 ? stage : stage + 1),
+        settings: getRandomItems(projectSettings)[0],
+    });
+}
+const projectMembers: { projectId: string; members: Project_Member[] }[] = [];
+for (const project of projects) {
+    const members = getRandomItems(USERS, 2, 6).map((user) => ({
+        user: user,
+        role: MemberRole.DEFAULT,
+    }));
+    members[0].role = MemberRole.ADMIN;
+
+    projectMembers.push({
+        projectId: project.id,
+        members: members,
+    });
+}
+
+const CRITERIA: Criterion[] = [
+    {
+        id: "1",
+        tag: "I1",
+        name: "Title Relevance",
+        description:
+            "The title of the paper must be relevant to the topic of the systematic review.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "2",
+        tag: "I2",
+        name: "Abstract Relevance",
+        description:
+            "The abstract of the paper should align with the inclusion criteria and cover the main aspects of the research topic.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "3",
+        tag: "I3",
+        name: "Publication Year",
+        description:
+            "The paper must have been published within the last 10 years to ensure the research is current.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "4",
+        tag: "I4",
+        name: "Peer-Reviewed",
+        description:
+            "The paper must be peer-reviewed to ensure the quality and validity of the research.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "5",
+        tag: "I5",
+        name: "Language",
+        description:
+            "The paper must be written in English or other predefined languages to be included.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "6",
+        tag: "I6",
+        name: "Research Design",
+        description:
+            "The paper must present original research (e.g., experimental, observational, case study, etc.) rather than reviews or theoretical papers.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "7",
+        tag: "I7",
+        name: "Study Population",
+        description:
+            "The paper must include a specific human, animal, or ecological population relevant to the systematic review's scope.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "8",
+        tag: "I8",
+        name: "Intervention Type",
+        description:
+            "The paper must focus on a specific intervention or treatment type that matches the review's inclusion criteria.",
+        category: CriterionCategory.INCLUSION,
+    },
+    {
+        id: "9",
+        tag: "HE9",
+        name: "Non-English Language",
+        description:
+            "The paper is excluded if it is not written in English or other predefined languages.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "10",
+        tag: "HE10",
+        name: "Non-Peer-Reviewed",
+        description:
+            "The paper is excluded if it is not peer-reviewed, as it may not meet the required research quality.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "11",
+        tag: "HE11",
+        name: "Duplicate Publication",
+        description:
+            "The paper is excluded if it is a duplicate of another included paper or presents the same data from the same research study.",
+        category: CriterionCategory.HARD_EXCLUSION,
+    },
+    {
+        id: "12",
+        tag: "E12",
+        name: "Research Type Not Relevant",
+        description:
+            "The paper is excluded if it does not contain original research (e.g., reviews, theoretical papers, or opinion articles).",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "13",
+        tag: "E13",
+        name: "Out of Scope",
+        description:
+            "The paper is excluded if it does not fit within the defined scope or objectives of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "14",
+        tag: "E14",
+        name: "Methodological Issues",
+        description:
+            "The paper is excluded if it contains significant methodological flaws that compromise the validity of the results.",
+        category: CriterionCategory.EXCLUSION,
+    },
+    {
+        id: "15",
+        tag: "E15",
+        name: "Non-Relevant Population",
+        description:
+            "The paper is excluded if the population studied is not relevant to the scope of the systematic review.",
+        category: CriterionCategory.EXCLUSION,
+    },
+];
+
+const AUTHORS: Author[] = [
+    { firstName: "John", lastName: "Doe", orcid: "0000-0002-1825-0097" },
+    { firstName: "Alice", lastName: "Smith", orcid: "0000-0003-1415-9267" },
+    { firstName: "Bob", lastName: "Johnson", orcid: "0000-0001-2345-6789" },
+    { firstName: "Catherine", lastName: "Williams", orcid: "0000-0002-9876-5432" },
+    { firstName: "David", lastName: "Brown", orcid: "0000-0001-5567-1234" },
+    { firstName: "Eve", lastName: "Jones", orcid: "0000-0003-5647-8901" },
+    { firstName: "Frank", lastName: "Miller", orcid: "0000-0002-2345-6789" },
+    { firstName: "Grace", lastName: "Davis", orcid: "0000-0001-3456-7890" },
+    { firstName: "Henry", lastName: "Garcia", orcid: "0000-0002-5432-1098" },
+    { firstName: "Ivy", lastName: "Martinez", orcid: "0000-0003-8765-4321" },
+    { firstName: "Jack", lastName: "Hernandez", orcid: "0000-0001-8765-4321" },
+    { firstName: "Kathy", lastName: "Lopez", orcid: "0000-0002-7654-3210" },
+    { firstName: "Luis", lastName: "Gonzalez", orcid: "0000-0003-8765-2109" },
+    { firstName: "Mia", lastName: "Wilson", orcid: "0000-0001-6543-2109" },
+    { firstName: "Noah", lastName: "Anderson", orcid: "0000-0002-6543-0987" },
+    { firstName: "Olivia", lastName: "Thomas", orcid: "0000-0001-5432-1098" },
+    { firstName: "Paul", lastName: "Taylor", orcid: "0000-0003-5432-1098" },
+    { firstName: "Quincy", lastName: "Moore", orcid: "0000-0001-4321-0987" },
+    { firstName: "Rachel", lastName: "Jackson", orcid: "0000-0002-4321-9876" },
+    { firstName: "Sam", lastName: "White", orcid: "0000-0003-3210-9876" },
+];
+
+const PAPER_TITLES = [
+    "Exploring the Universe of AI",
+    "Quantum Computing: An Overview",
+    "The Role of Data in Modern Research",
+    "Artificial Intelligence in Healthcare",
+    "The Ethics of Artificial Intelligence",
+    "Blockchain Technology: A New Era of Security",
+    "Renewable Energy: Global Perspectives",
+    "The Future of Transportation",
+    "Machine Learning in Financial Systems",
+    "The Internet of Things: Implications for Privacy",
+    "Advances in Deep Learning",
+    "The Impact of AI on Employment",
+    "Cybersecurity in the Age of IoT",
+    "The Role of Big Data in Healthcare",
+    "Augmented Reality: Shaping the Future of Education",
+    "Sustainable Development through Renewable Energy",
+    "Neuroscience and the Human Brain",
+    "5G Networks: Opportunities and Challenges",
+    "The Future of Space Exploration",
+    "The Ethics of Gene Editing",
+    "Artificial Intelligence in Business",
+    "Smart Cities and Urban Development",
+    "The Impact of Climate Change on Agriculture",
+    "Biotechnology in Environmental Protection",
+    "The Role of Artificial Intelligence in Healthcare Diagnostics",
+    "The Impact of Automation on Society",
+    "Data Privacy in the Digital Age",
+    "The Role of AI in Healthcare Administration",
+    "Quantum Computing: The Next Frontier",
+    "Blockchain in Finance: A Revolutionary Technology",
+    "The Future of Autonomous Vehicles",
+    "The Rise of Virtual Reality in Entertainment",
+    "Energy Storage Solutions for a Sustainable Future",
+    "AI in Healthcare: Opportunities and Challenges",
+    "The Role of Biotechnology in Sustainable Agriculture",
+    "Climate Change and Water Scarcity: A Global Challenge",
+    "Machine Learning in Financial Forecasting",
+    "The Impact of Artificial Intelligence on Creativity",
+    "Digital Transformation in Healthcare Systems",
+    "Robotic Process Automation: Revolutionizing Business Operations",
+    "Artificial Intelligence for Drug Discovery",
+    "The Evolution of E-Commerce in the Digital Age",
+    "Wearable Technology: Health Monitoring and Beyond",
+    "The Promise and Perils of Autonomous Systems",
+];
+const PAPER_DOIS = [
+    "10.1234/abcd.5678",
+    "",
+    "10.2345/xyz.9876",
+    "10.5432/lmn.1234",
+    "",
+    "10.6789/pqr.4321",
+    "",
+    "10.2468/uvw.1357",
+    "",
+    "10.3456/stu.7689",
+    "10.1111/abc.1234",
+    "",
+    "10.3457/xyz.9876",
+    "",
+    "10.2345/abc.1234",
+    "",
+    "10.4568/xyz.4567",
+    "",
+    "",
+    "10.6547/xyz.2345",
+    "",
+    "10.9876/abc.3456",
+    "",
+    "10.1122/xyz.5678",
+    "",
+    "10.3459/pqr.3456",
+    "",
+    "10.0987/xyz.6543",
+    "",
+    "10.6723/xyz.1290",
+    "",
+    "10.9875/abc.6543",
+    "",
+    "10.5468/xyz.2347",
+    "",
+    "10.7852/abc.1234",
+    "",
+    "10.8976/xyz.5678",
+    "",
+    "10.5627/abc.3124",
+    "",
+    "10.4312/abc.2111",
+    "",
+    "10.7589/xyz.7777",
+];
+
+const PAPER_ABSTRACTS = [
+    "Artificial Intelligence (AI) has been a subject of research for decades. It has revolutionized multiple fields, from healthcare to finance. However, there are still significant challenges in terms of ethics and implementation. AI systems require vast datasets to train, and biases in those datasets can lead to unfair results. The future of AI promises more intuitive machines, but there is a need for further exploration of its social impacts. With advancements in machine learning, AI continues to evolve. Yet, the boundaries of what AI can achieve remain unclear. In this paper, we discuss both the current state and future possibilities of AI technologies. We also provide a roadmap for overcoming its limitations.",
+    "Quantum computing represents a major shift in the way we approach computation. Unlike classical computers, quantum computers harness the principles of quantum mechanics. These systems use qubits instead of traditional bits, offering potential advantages in solving complex problems. Researchers have already demonstrated quantum supremacy in specific tasks. However, quantum computing is still in its infancy, with many technical challenges remaining. Scalability, error rates, and qubit coherence time are among the issues that need to be addressed. Despite these challenges, the potential impact on fields like cryptography and drug discovery is enormous. This paper outlines the state of quantum computing and the hurdles it faces on its path to widespread adoption.",
+    "In modern research, data plays a crucial role in driving discoveries. The availability of vast amounts of data has changed how research is conducted across many domains. However, data alone is not enough; it must be interpreted correctly. Researchers need to be equipped with tools to handle large datasets, such as machine learning algorithms and statistical models. This paper explores how data science has impacted various research fields, including biology, physics, and economics. The challenges of data privacy and security are also discussed. Furthermore, the paper highlights the ethical considerations in data collection and usage. The future of research relies heavily on how data is handled and analyzed.",
+    "The application of AI in healthcare has seen significant growth in recent years. From diagnostic tools to personalized treatment plans, AI is revolutionizing medical practices. However, implementing AI solutions in healthcare presents unique challenges. Data privacy and security remain top concerns, especially given the sensitive nature of medical information. Moreover, the integration of AI into existing healthcare systems requires substantial investment. Despite these hurdles, the potential to improve patient outcomes is immense. AI-powered devices can analyze medical images with remarkable accuracy. In this paper, we explore the state of AI in healthcare and the barriers to its full integration.",
+    "",
+    "Blockchain technology has emerged as a revolutionary way to secure digital transactions. It ensures data integrity through decentralized systems and cryptographic algorithms. The promise of blockchain goes beyond cryptocurrencies, with applications in supply chain management, healthcare, and voting systems. However, the technology is not without its challenges. Issues such as scalability, energy consumption, and regulatory concerns need to be addressed. In this paper, we review the evolution of blockchain technology and its current applications. We also discuss the potential for blockchain to disrupt traditional industries and the barriers to its widespread adoption. Despite the challenges, blockchain remains a promising technology with wide-reaching implications.",
+    "Renewable energy sources have gained significant attention as a response to the global energy crisis. Solar, wind, and hydropower are leading the charge in reducing dependence on fossil fuels. However, the transition to renewable energy is not without challenges. Factors such as cost, infrastructure, and political will are key barriers to implementation. This paper examines the current state of renewable energy around the world and the policy measures that support it. It also explores technological advancements that have made renewable energy more efficient and affordable. As the global demand for energy continues to rise, renewable energy may play a crucial role in mitigating climate change.",
+    "",
+    "",
+    "",
+    "Deep learning has emerged as one of the most influential techniques in machine learning. With the development of sophisticated neural networks, deep learning has revolutionized fields like computer vision, natural language processing, and speech recognition. This paper explores recent advancements in deep learning architectures, including convolutional and recurrent neural networks. It also discusses the applications of deep learning in various industries, along with the challenges that remain in terms of data availability, training costs, and model interpretability.",
+    "Artificial intelligence is reshaping the labor market by automating jobs traditionally performed by humans. This paper examines the potential impact of AI technologies on employment across different sectors, from manufacturing to healthcare. While AI promises to improve efficiency and reduce costs, it also raises concerns about job displacement and economic inequality. The paper discusses the need for new policies and strategies to address the societal implications of AI-driven job changes.",
+    "The rapid growth of the Internet of Things (IoT) has created new opportunities for connectivity, but it also presents significant cybersecurity challenges. This paper explores the security risks posed by the proliferation of connected devices and offers recommendations for improving IoT security. Topics discussed include encryption, device authentication, and secure data transmission protocols. The paper emphasizes the importance of collaboration between industries, governments, and consumers to safeguard the growing network of connected devices.",
+    "Big data analytics is transforming the healthcare industry by enabling more personalized and effective treatments. This paper reviews the current state of big data in healthcare, from patient records to real-time monitoring. It explores how big data tools are being used to improve diagnostics, treatment planning, and patient care. The paper also addresses the ethical and privacy concerns that arise when dealing with sensitive health data, and proposes ways to overcome these challenges.",
+    "Augmented reality (AR) is poised to revolutionize the educational landscape by offering immersive and interactive learning experiences. This paper investigates the potential applications of AR in classrooms, such as virtual field trips, 3D models of complex concepts, and real-time collaboration. The paper also discusses the challenges of implementing AR in education, including cost, infrastructure, and teacher training.",
+    "The transition to renewable energy is a critical part of global efforts to combat climate change. This paper examines the role of renewable energy in achieving sustainable development goals, with a focus on solar, wind, and hydroelectric power. It explores the environmental, economic, and social benefits of renewable energy, as well as the challenges related to energy storage, grid integration, and political support.",
+    "Recent advancements in neuroscience have provided deeper insights into the human brain and its functioning. This paper reviews current research on brain-computer interfaces, neural plasticity, and cognitive enhancement. It explores the implications of these advancements for fields such as medicine, psychology, and artificial intelligence. The paper also highlights the ethical considerations of manipulating the human brain through technology.",
+    "",
+    "Space exploration has reached new heights with the development of private space travel companies, such as SpaceX and Blue Origin. This paper reviews the advancements in space technology, including reusable rockets and space tourism. It also discusses the potential for human colonization of other planets and the ethical considerations surrounding the exploration and exploitation of outer space.",
+    "Gene editing technologies, such as CRISPR, have made it possible to manipulate the DNA of living organisms with unprecedented precision. This paper explores the ethical implications of gene editing, including its potential to eliminate genetic diseases, its use in enhancing human traits, and the possibility of creating 'designer babies'. The paper also discusses the regulatory frameworks needed to ensure the responsible use of gene editing technologies.",
+    "",
+    "",
+    "Climate change is expected to have significant impacts on global agriculture, affecting crop yields, food security, and farming practices. This paper reviews the potential effects of climate change on agriculture, including changes in temperature, precipitation patterns, and the frequency of extreme weather events. The paper also explores adaptation strategies that can help mitigate the impacts of climate change on agriculture.",
+    "Biotechnology has significant potential in addressing environmental challenges, including pollution control, waste management, and conservation efforts. This paper explores the various applications of biotechnology in environmental protection, such as the use of microbes to clean up oil spills, the development of biofuels, and the restoration of damaged ecosystems. The paper also examines the future potential of biotechnology in environmental sustainability.",
+    "Artificial intelligence is increasingly being used in healthcare diagnostics, from image recognition to predictive analytics. This paper examines the role of AI in enhancing diagnostic accuracy, reducing errors, and improving patient outcomes. The paper also explores the ethical and regulatory challenges of integrating AI into clinical practice.",
+    "",
+    "As digital technologies continue to evolve, data privacy has become an increasingly important issue. This paper discusses the challenges of protecting personal data in a world where data is being collected and shared at an unprecedented scale. It explores current data privacy laws, such as GDPR, and examines the role of technology in safeguarding personal information.",
+    "AI is increasingly being used to streamline healthcare administration, from appointment scheduling to patient record management. This paper explores how AI can improve efficiency and reduce administrative costs in healthcare settings. The paper also discusses the challenges of implementing AI in healthcare organizations, including integration with existing systems and staff training.",
+    "Quantum computing promises to solve complex problems that are beyond the reach of classical computers. This paper explores the principles of quantum computing, including quantum entanglement and superposition, and discusses its potential applications in fields such as cryptography, optimization, and drug discovery. The challenges of building stable quantum computers are also addressed, alongside the future outlook for this transformative technology.",
+    "",
+    "Autonomous vehicles are poised to transform the transportation industry, promising safer, more efficient travel. This paper reviews the latest advancements in self-driving car technology, including machine learning algorithms, sensor fusion, and real-time decision-making systems. The challenges of achieving full autonomy, such as regulatory approval and public trust, are also discussed.",
+    "Virtual reality (VR) is transforming the entertainment industry, offering immersive experiences in gaming, movies, and theme parks. This paper explores the growth of VR technology and its impact on how people consume entertainment. It also discusses the challenges of VR adoption, such as hardware costs, content creation, and user experience design.",
+    "The need for efficient energy storage solutions is critical for transitioning to renewable energy sources. This paper reviews current energy storage technologies, including lithium-ion batteries, pumped hydro storage, and emerging technologies such as solid-state batteries. The paper also examines the environmental impact and scalability of various energy storage solutions.",
+    "Artificial intelligence has significant potential to improve healthcare by assisting in diagnostics, treatment planning, and personalized medicine. This paper discusses the opportunities AI offers in healthcare, including improving patient outcomes and reducing healthcare costs. It also addresses the challenges of integrating AI into clinical practice, such as data privacy, algorithm bias, and regulatory hurdles.",
+    "Biotechnology plays a crucial role in improving agricultural productivity and sustainability. This paper explores the use of genetically modified crops, plant breeding techniques, and biofertilizers to enhance crop yields and reduce the environmental impact of agriculture. The paper also discusses the ethical and regulatory concerns surrounding biotechnology in agriculture.",
+    "Climate change is exacerbating water scarcity around the world, affecting billions of people. This paper examines the link between climate change and water availability, focusing on the impacts of droughts, changing precipitation patterns, and melting glaciers. The paper also discusses strategies for managing water resources in the face of these challenges, including water conservation, desalination, and improved irrigation techniques.",
+    "Machine learning techniques are increasingly being used in financial forecasting to predict stock prices, market trends, and economic indicators. This paper reviews the use of machine learning algorithms, such as regression analysis, decision trees, and neural networks, in financial markets. The paper also explores the challenges of model accuracy, data quality, and market volatility in financial forecasting.",
+    "Artificial intelligence is increasingly being used in creative fields such as music composition, art generation, and content creation. This paper explores the role of AI in enhancing human creativity, including AI-assisted design tools and generative algorithms. The paper also discusses the potential risks of AI replacing human creativity and the ethical implications of AI-generated content.",
+    "",
+    "Robotic process automation (RPA) is transforming business operations by automating repetitive tasks and improving efficiency. This paper explores the potential applications of RPA in various industries, including finance, healthcare, and manufacturing. The paper also discusses the challenges of implementing RPA, such as integration with legacy systems and employee resistance to change.",
+    "",
+    "E-commerce has grown rapidly with the advent of digital technologies, transforming the way businesses and consumers interact. This paper reviews the evolution of e-commerce, from traditional online shopping to the rise of mobile commerce, social commerce, and personalized shopping experiences. The paper also discusses the future of e-commerce, including the role of artificial intelligence, virtual reality, and blockchain in shaping the online shopping experience.",
+    "Wearable technology, including smartwatches, fitness trackers, and health monitoring devices, is transforming how individuals track their health and well-being. This paper explores the current state of wearable technology, including its use in monitoring vital signs, sleep patterns, and physical activity. It also discusses the potential for wearable devices to revolutionize healthcare by enabling remote patient monitoring and personalized health interventions.",
+    "Autonomous systems, from self-driving cars to drones and robots, are rapidly becoming part of everyday life. This paper reviews the advancements in autonomous system technologies, focusing on their potential to improve efficiency, safety, and accessibility in various sectors. It also addresses the ethical and societal challenges posed by the widespread adoption of autonomous systems, including safety, accountability, and regulation.",
+];
+
+const YEARS = [1999, 2014, 2016, 2019, 2020, 2021, 2022, 2023, 2024];
+const PUBLISHER = [
+    "Springer",
+    "IEEE",
+    "ACM",
+    "Elsevier",
+    "Wiley",
+    "Taylor & Francis",
+    "MIT Press",
+    "Cambridge University Press",
+    "Oxford University Press",
+    "CRC Press",
+];
+const PUBLICATION_NAMES = [
+    "Journal of Artificial Intelligence Research",
+    "",
+    "Journal of Data Science",
+    "AI in Healthcare Journal",
+    "AI Ethics Review",
+    "Journal of Blockchain Technology",
+    "Global Energy Review",
+    "Transportation Today",
+    "Journal of Financial Technology",
+    "IoT Security Journal",
+    "Journal of Machine Learning Research",
+    "AI & Society",
+    "Journal of Cybersecurity",
+    "Healthcare Data Review",
+    "Journal of Educational Technology",
+    "",
+    "Journal of Neuroscience",
+    "Telecommunications Review",
+    "",
+    "Ethics in Biotechnology",
+    "Business Technology Review",
+    "Urban Technology Journal",
+    "",
+    "Environmental Biotechnology Journal",
+    "Healthcare AI Review",
+    "Automation & Society",
+    "Journal of Digital Privacy",
+    "Healthcare Administration Review",
+    "Quantum Computing Review",
+    "Blockchain Journal",
+    "",
+    "Entertainment Technology Review",
+    "Sustainable Energy Review",
+    "AI & Healthcare Journal",
+    "",
+    "Global Environmental Change",
+    "",
+    "",
+    "",
+    "Automation in Business Journal",
+    "Journal of Drug Discovery and Development",
+    "E-Commerce Trends Journal",
+    "Wearable Tech Journal",
+    "",
+];
+const PUBLICATION_TYPES = [
+    "Journal Article",
+    "Book",
+    "Conference Paper",
+    "Magazine Article",
+    "Newspaper Article",
+    "Research Report",
+    "White Paper",
+    "Thesis/Dissertation",
+    "Blog Post",
+    "Online Article",
+];
+
+const PAPER_IDS: string[] = Array.from({ length: PAPER_TITLES.length }).map((_, i) => "" + i);
+const papers: Paper[] = [];
+for (const [index, paperTitle] of PAPER_TITLES.entries()) {
+    papers.push({
+        id: "" + index,
+        externalId: PAPER_DOIS[index],
+        title: paperTitle,
+        abstrakt: PAPER_ABSTRACTS[index],
+        year: getRandomItems(YEARS)[0],
+        publisher: getRandomItems(PUBLISHER)[0],
+        publicationName: PUBLICATION_NAMES[index],
+        publicationType: getRandomItems(PUBLICATION_TYPES)[0],
+        hasPdf: Math.random() < 0.6,
+        authors: getRandomItems(AUTHORS, 0, 4),
+        backwardReferencedIds: getRandomItems(PAPER_IDS, 3, 10),
+    });
+}
+
+const userSettings: UserSettings[] = [];
+for (let i = 0; i < 10; i++) {
+    userSettings.push({
+        showHotkeys: Math.random() < 0.5,
+        reviewMode: Math.random() < 0.8,
+        defaultProjectSettings: getRandomItems(projectSettings)[0],
+        defaultCriteria: { criteria: getRandomItems(CRITERIA, 2, 4) },
+    });
+}
+
+const reviews: Review[] = [];
+for (let i = 0; i < 200; i++) {
path: src/data/standardData.ts
user: login: Slartibartfass2
body: Thanks
created_at: 2025-03-10T11:03:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
+
+// Check, whether the dummy admin user should be added or not
+if (isOptionEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
+    LOG.warn("Security Risk: dummy admin user enabled!");
+    USERS.set("admin@admin", {
+        id: "admin@admin",
+        email: "admin@admin",
+        firstName: "admin",
+        lastName: "admin",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+        password: "admin",
+        accessToken: "admin",
+        refreshToken: "admin",
+    });
+    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+}
+
+// Check, whether a filepath to a file containing example data for the mock backend is set
+if (process.env.EXAMPLE_DATA_FILE !== undefined && process.env.EXAMPLE_DATA_FILE !== "") {
+    loadExampleData(process.env.EXAMPLE_DATA_FILE);
+}
path: src/main.ts
user: login: Slartibartfass2
body: Yes, you're right.
created_at: 2025-03-10T11:05:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,3 +40,36 @@ server.bindAsync(
         }
     },
 );
+
+/* parse environment variables */
+
+// Initializing the logging
+const level = process.env.LOG_LEVEL ?? "debug";
+export const LOG = pino({
+    level: level,
+    transport: {
+        target: "pino-pretty",
+    },
+});
path: src/main.ts
user: login: Slartibartfass2
body: No, that's fine for me.
created_at: 2025-03-10T11:05:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,69 +1,152 @@
 import { LoginSecret } from "./grpc-gen/authentication";
 import { Criterion } from "./grpc-gen/criterion";
 import { Paper } from "./grpc-gen/paper";
-import { Project, Project_Member, Project_Paper } from "./grpc-gen/project";
+import { PaperDecision, Project, Project_Member, Project_Paper } from "./grpc-gen/project";
 import { Review } from "./grpc-gen/review";
-import { User, UserRole, UserStatus } from "./grpc-gen/user";
+import { User } from "./grpc-gen/user";
 import { UserSettings } from "./grpc-gen/user_settings";
-import { LOG } from "./log";
+import { fromUser, getRandomItems } from "./util";
+import { LOG } from "./main";
 
 export type ServerUser = User & { password: string } & LoginSecret;
 export type ServerProjectPaper = Omit<Project_Paper, "reviews">;
 
-export const AVAILABLE_FETCHERS = ["fake", "mock"];
-// User id => User
+/* Maps storing all data of the mock backend and simulating a "database" */
+export const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+// User id => User (with login credentials and password)
 export const USERS: Map<string, ServerUser> = new Map();
 // Project id => Project
 export const PROJECTS: Map<string, Project> = new Map();
-// Project id => Ids of Project Paper Entities belonging to Project
+// Project id => Ids of project paper entities belonging to the project
 export const PROJECT_PROJECT_PAPERS: Map<string, string[]> = new Map();
-// Project Paper id => Project Paper
+// Project Paper id => Project paper
 export const PROJECT_PAPERS: Map<string, ServerProjectPaper> = new Map();
 // Paper id => Paper
 export const PAPERS: Map<string, Paper> = new Map();
-// User id => User Settings
+// User id => User settings
 export const USER_SETTINGS: Map<string, UserSettings> = new Map();
-// User id => List of Papers
+// User id => List of papers of the reading list of the user with the id
 export const READING_LISTS: Map<string, Paper[]> = new Map();
-// Project id => List of Project Members
+// Project id => List of project members of this project
 export const MEMBERS: Map<string, Project_Member[]> = new Map();
-// Project id => Progress in range [0,1]
+// Project id => Progress of the current stage in range [0,1]
 export const PROGRESS: Map<string, number> = new Map();
-// Project id => Ids of Criteria
+// Project id => Ids of criteria
 export const PROJECT_CRITERIA: Map<string, string[]> = new Map();
 // Criterion id => Criterion
 export const CRITERIA: Map<string, Criterion> = new Map();
 // Review id => Review
 export const REVIEWS: Map<string, Review> = new Map();
-// Project Paper id => Ids of Reviews
+// Project Paper id => Ids of reviews for this project paper
 export const PAPER_REVIEWS: Map<string, string[]> = new Map();
 // Paper Id => PDF Blob
 export const PAPER_PDFS: Map<string, Uint8Array> = new Map();
 
-export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
-    return {
-        ...paper,
-        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
-    };
+export interface ExampleData {
+    criteria?: Criterion[];
+    papers?: Paper[];
+    users?: User[];
+    userSettings?: UserSettings[];
+    projects?: Project[];
+    projectMembers?: { projectId: string; members: Project_Member[] }[];
+    reviews?: Review[];
+    projectPapers?: Project_Paper[];
 }
 
-function isEnabled(option: string | undefined): boolean {
-    option = option?.toLowerCase() ?? "";
-    return option == "1" || option == "yes" || option == "true";
-}
+/**
+ * Processes the loaded example data, i.e. (eventually) initializing the maps (= "database")
+ * containing all the data of the mock backend.
+ *
+ * @param data the loaded example data
+ */
+function processExampleData(data: ExampleData) {
+    data.criteria?.forEach((criterion) => CRITERIA.set(criterion.id, criterion));
+    data.papers?.forEach((paper) => PAPERS.set(paper.id, paper));
+    data.reviews?.forEach((review) => REVIEWS.set(review.id, review));
+    data.users?.forEach((user) => {
+        USERS.set(
+            user.email,
+            fromUser(user, `user${user.id}`, { accessToken: "", refreshToken: "" }),
+        );
+
+        // create random reading list for this user
+        READING_LISTS.set(user.email, getRandomItems(Array.from(PAPERS.values()), 4, 10));
 
-if (isEnabled(process.env.ENABLE_DUMMY_ADMIN)) {
-    LOG.warn("Security Risk: Dummy Admin User Enabled!");
-    USERS.set("admin@admin", {
-        id: "admin@admin",
-        email: "admin@admin",
-        firstName: "admin",
-        lastName: "admin",
-        role: UserRole.ADMIN,
-        status: UserStatus.ACTIVE,
-        password: "admin",
-        accessToken: "admin",
-        refreshToken: "admin",
+        // add user settings
+        USER_SETTINGS.set(user.email, getRandomItems(data.userSettings ?? [])[0]);
     });
-    LOG.info(USERS.get("admin@admin"), "The dummy admin user");
+    data.projects?.forEach((project) => {
+        PROJECTS.set(project.id, project);
+        PROJECT_PROJECT_PAPERS.set(project.id, []);
+
+        // create project criteria
+        PROJECT_CRITERIA.set(project.id, getRandomItems(Array.from(CRITERIA.keys()), 5, 10).sort());
+
+        // create a set of project papers
+        getRandomItems(Array.from(data.projectPapers ?? []), 25, 40)
+            .filter((paper) => paper.stage <= project.maxStage)
+            .map((paper) => ({ ...paper, id: project.id + "-" + paper.id }))
+            .forEach((paper: Project_Paper) => {
+                PROJECT_PAPERS.set(paper.id, paper);
+                PROJECT_PROJECT_PAPERS.get(project.id)?.push(paper.id);
+
+                // add paper reviews in separate PAPER_REVIEWS map
+                PAPER_REVIEWS.set(
+                    paper.id,
+                    paper.reviews.map((review) => review.id),
+                );
+            });
+
+        // set the progress of the project
+        PROGRESS.set(
+            project.id,
+            ((PROJECT_PROJECT_PAPERS.get(project.id)
+                ?.map((id) => PROJECT_PAPERS.get(id))
+                .filter(
+                    (paper) =>
+                        paper !== undefined &&
+                        paper.stage === project.currentStage &&
+                        paper.decision !== PaperDecision.UNDECIDED,
+                ).length ?? 0) *
+                100) /
+                (PROJECT_PROJECT_PAPERS.get(project.id)?.length ?? Infinity),
path: src/model.ts
user: login: Slartibartfass2
body: Looks better now. Thanks.
created_at: 2025-03-10T11:45:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
path: src/service.ts
user: login: Slartibartfass2
body: It would be good, to know the reason for this. But we can keep it as is for now.
created_at: 2025-03-10T11:52:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -53,25 +145,69 @@ export function findFirst<T, K extends keyof T, V extends T[K]>(
             return object;
         }
     }
-
     return null;
 }
 
+/**
+ * Generates the next id.
+ *
+ * @param objs the map of already exist elements with ids
+ * @return the next available id
+ */
+export function getNextId<T extends Map<string, V>, V>(objs: T): string {
+    let i = objs.size;
+    while (objs.has(i.toString())) {
+        i++;
+    }
+    return i.toString();
+}
+
+/**
+ * Adds review details to a project paper.
+ *
+ * @param paper the project paper to extend with review information
+ * @return the new project paper with an added 'reviews' array populated from the associated reviews
+ */
+export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
+    return {
+        ...paper,
+        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
+    };
+}
+
+/**
+ * Checks if any property in an object (including nested objects) is undefined.
+ *
+ * @param obj the object to check
+ * @returns true if any property (or sub-property) is undefined, otherwise false
+ */
 export function anythingUndefined<T extends object>(obj: T): boolean {
     return Object.values(obj).some((v) => {
         return v == undefined || (typeof v === "object" && anythingUndefined(v));
     });
 }
 
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export function isSnowballRService(methodDescriptor: ServerMethodDefinition<any, any>): boolean {
-    return methodDescriptor.path.startsWith("/snowballr.SnowballR/");
+/**
+ * Checks whether the given string indicates that an option is enabled.
+ * An option is considered as enabled, if it is set to either:
+ * - 1
+ * - (y/Y)es
+ * - (t/T)rue
+ *
+ * @param option the input to check
+ * @return true, if the given option is set to value listed above, otherwise false
+ */
+export function isOptionEnabled(option?: string): boolean {
+    option = option?.toLowerCase() ?? "";
+    return ["1", "yes", "true"].includes(option);
 }
 
-export function getNextId<T extends Map<string, V>, V>(objs: T): string {
-    let i = objs.size;
-    while (objs.has(i.toString())) {
-        i++;
-    }
-    return i.toString();
+/**
+ * Asserts that a given conditions holds and throws an error, if not
+ *
+ * @param condition the condition that must hold
+ * @param msg the error message, if the condition is not true
+ */
+export function assert(condition: unknown, msg?: string): asserts condition {
+    if (condition === false) throw new Error(msg);
 }
path: src/util.ts
user: login: Slartibartfass2
body: Is there a reason, why don't we use Node's `assert` function?
created_at: 2025-03-10T11:58:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -53,25 +145,69 @@ export function findFirst<T, K extends keyof T, V extends T[K]>(
             return object;
         }
     }
-
     return null;
 }
 
+/**
+ * Generates the next id.
+ *
+ * @param objs the map of already exist elements with ids
+ * @return the next available id
+ */
+export function getNextId<T extends Map<string, V>, V>(objs: T): string {
+    let i = objs.size;
+    while (objs.has(i.toString())) {
+        i++;
+    }
+    return i.toString();
+}
+
+/**
+ * Adds review details to a project paper.
+ *
+ * @param paper the project paper to extend with review information
+ * @return the new project paper with an added 'reviews' array populated from the associated reviews
+ */
+export function addProjectPaperReviews(paper: ServerProjectPaper): Project_Paper {
+    return {
+        ...paper,
+        reviews: PAPER_REVIEWS.get(paper.id)!.map((reviewId) => REVIEWS.get(reviewId)!),
+    };
+}
+
+/**
+ * Checks if any property in an object (including nested objects) is undefined.
+ *
+ * @param obj the object to check
+ * @returns true if any property (or sub-property) is undefined, otherwise false
+ */
 export function anythingUndefined<T extends object>(obj: T): boolean {
     return Object.values(obj).some((v) => {
         return v == undefined || (typeof v === "object" && anythingUndefined(v));
     });
 }
 
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export function isSnowballRService(methodDescriptor: ServerMethodDefinition<any, any>): boolean {
-    return methodDescriptor.path.startsWith("/snowballr.SnowballR/");
+/**
+ * Checks whether the given string indicates that an option is enabled.
+ * An option is considered as enabled, if it is set to either:
+ * - 1
+ * - (y/Y)es
+ * - (t/T)rue
+ *
+ * @param option the input to check
+ * @return true, if the given option is set to value listed above, otherwise false
+ */
+export function isOptionEnabled(option?: string): boolean {
+    option = option?.toLowerCase() ?? "";
+    return ["1", "yes", "true"].includes(option);
 }
 
-export function getNextId<T extends Map<string, V>, V>(objs: T): string {
-    let i = objs.size;
-    while (objs.has(i.toString())) {
-        i++;
-    }
-    return i.toString();
+/**
+ * Asserts that a given conditions holds and throws an error, if not
+ *
+ * @param condition the condition that must hold
+ * @param msg the error message, if the condition is not true
+ */
+export function assert(condition: unknown, msg?: string): asserts condition {
+    if (condition === false) throw new Error(msg);
 }
path: src/util.ts
user: login: Merseleo
body: Because I am lost, I delete this util function and used the `assert` function from Node
created_at: 2025-03-10T14:37:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -206,14 +206,15 @@ export const snowballRService: ISnowballR = {
         const { oldPassword, newPassword } = call.request;
         const user = getAuthenticated(call.metadata)!;
 
-        if (user.password == oldPassword) {
-            USERS.get(user.email)!.password = newPassword;
-            callback(null, {});
-        } else {
+        if (user.password != oldPassword) {
path: src/service.ts
user: login: Merseleo
body: Ok, you are free to ask Luca for the reason.
created_at: 2025-03-10T14:41:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
path: src/data/standardData.ts
user: login: Merseleo
body: Now I understand your idea and I agree (btw thank you for the issue). And as soon as we adapt the API and compile the proto files, the example data in the mock backend wouldn't work anymore, as they wouldn't match the new `ReviewDecisionMatrix_Pattern` type and then we can change it.
created_at: 2025-03-10T14:48:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,772 @@
+import { User, UserRole, UserStatus } from "../grpc-gen/user";
+import { ExampleData } from "../model";
+import {
+    MemberRole,
+    PaperDecision,
+    Project,
+    Project_Member,
+    Project_Paper,
+    Project_Settings,
+    ProjectStatus,
+    ReviewDecisionMatrix,
+    ReviewDecisionMatrix_Pattern,
+    SnowballingType,
+} from "../grpc-gen/project";
+import { Review, ReviewDecision } from "../grpc-gen/review";
+import { Criterion, CriterionCategory } from "../grpc-gen/criterion";
+import { Author, Paper } from "../grpc-gen/paper";
+import { getRandomItems } from "../util";
+import { UserSettings } from "../grpc-gen/user_settings";
+
+const USERS: User[] = [
+    {
+        id: "alice.smith@example.com",
+        email: "alice.smith@example.com",
+        firstName: "Alice",
+        lastName: "Smith",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "bob.jones@example.com",
+        email: "bob.jones@example.com",
+        firstName: "Bob",
+        lastName: "Jones",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "charlie.davis@example.com",
+        email: "charlie.davis@example.com",
+        firstName: "Charlie",
+        lastName: "Davis",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "diana.martin@example.com",
+        email: "diana.martin@example.com",
+        firstName: "Diana",
+        lastName: "Martin",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "edward.miller@example.com",
+        email: "edward.miller@example.com",
+        firstName: "Edward",
+        lastName: "Miller",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "fiona.wilson@example.com",
+        email: "fiona.wilson@example.com",
+        firstName: "Fiona",
+        lastName: "Wilson",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "george.anderson@example.com",
+        email: "george.anderson@example.com",
+        firstName: "George",
+        lastName: "Anderson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "hannah.taylor@example.com",
+        email: "hannah.taylor@example.com",
+        firstName: "Hannah",
+        lastName: "Taylor",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "ian.thomas@example.com",
+        email: "ian.thomas@example.com",
+        firstName: "Ian",
+        lastName: "Thomas",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "julia.clark@example.com",
+        email: "julia.clark@example.com",
+        firstName: "Julia",
+        lastName: "Clark",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "11",
+        email: "kevin.roberts@example.com",
+        firstName: "Kevin",
+        lastName: "Roberts",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "laura.harris@example.com",
+        email: "laura.harris@example.com",
+        firstName: "Laura",
+        lastName: "Harris",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "michael.clarkson@example.com",
+        email: "michael.clarkson@example.com",
+        firstName: "Michael",
+        lastName: "Clarkson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "nina.evans@example.com",
+        email: "nina.evans@example.com",
+        firstName: "Nina",
+        lastName: "Evans",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "oliver.white@example.com",
+        email: "oliver.white@example.com",
+        firstName: "Oliver",
+        lastName: "White",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "paula.thompson@example.com",
+        email: "paula.thompson@example.com",
+        firstName: "Paula",
+        lastName: "Thompson",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "quentin.brown@example.com",
+        email: "quentin.brown@example.com",
+        firstName: "Quentin",
+        lastName: "Brown",
+        role: UserRole.ADMIN,
+        status: UserStatus.DELETED,
+    },
+    {
+        id: "rachel.lee@example.com",
+        email: "rachel.lee@example.com",
+        firstName: "Rachel",
+        lastName: "Lee",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "steven.walker@example.com",
+        email: "steven.walker@example.com",
+        firstName: "Steven",
+        lastName: "Walker",
+        role: UserRole.DEFAULT,
+        status: UserStatus.ACTIVE,
+    },
+    {
+        id: "tina.adams@example.com",
+        email: "tina.adams@example.com",
+        firstName: "Tina",
+        lastName: "Adams",
+        role: UserRole.ADMIN,
+        status: UserStatus.ACTIVE,
+    },
+];
+
+const AVAILABLE_FETCHERS = [
+    "arXiv API",
+    "Semantic Scholar API",
+    "PubMed API",
+    "CrossRef API",
+    "CORE API",
+    "Springer Nature API",
+    "Elsevier Scopus API",
+    "IEEE Xplore API",
+    "OpenCitations API",
+    "Europe PMC API",
+];
+
+const PATTERN_2: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    { reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+    { reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE], decision: PaperDecision.DECLINED },
+    { reviews: [ReviewDecision.MAYBE, ReviewDecision.MAYBE], decision: PaperDecision.UNDECIDED },
+];
+
+const PATTERN_3: ReviewDecisionMatrix_Pattern[] = [
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.ACCEPTED, ReviewDecision.DECLINED],
+        decision: PaperDecision.DECLINED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.ACCEPTED],
+        decision: PaperDecision.UNDECIDED,
+    },
+    {
+        reviews: [ReviewDecision.ACCEPTED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.ACCEPTED,
+    },
+    {
+        reviews: [ReviewDecision.DECLINED, ReviewDecision.MAYBE, ReviewDecision.MAYBE],
+        decision: PaperDecision.DECLINED,
+    },
+];
+
+const reviewDecisionMatrices: ReviewDecisionMatrix[] = [];
+for (let i = 0; i < 7; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 2,
+        patterns: getRandomItems(PATTERN_2, 2, 5),
+    });
+}
+for (let i = 0; i < 3; i++) {
+    reviewDecisionMatrices.push({
+        numberOfReviewers: 3,
+        patterns: getRandomItems(PATTERN_3, 2, 4),
+    });
+}
path: src/data/standardData.ts
user: login: Merseleo
body: No you are right and this also explains, why often the projects only have papers in one stage with one or two decision types (in #30 in the frontend). I will change this.
created_at: 2025-03-10T14:53:08Z
author_association: CONTRIBUTOR

PR comments:
user: login: Merseleo
created_at: 2025-03-06T18:00:37Z
body: Please let me know, whether we want to merge the last commit or whether I should revoke it (contains only style changes, so standardized error messages and return as early as possible with a error message, if any problem occurred).
author_association: CONTRIBUTOR
user: login: Merseleo
created_at: 2025-03-08T10:37:29Z
body: > What are your thoughts on a template, i.e., the `standardData` file but with empty lists. So whenever somebody would like to add their own data file, they could use the template.

To be honest: I think that the "effort" of the template would not be worth the benefit. I really somebody else want different data it should be no problem to copy the current file and change everything that is wanted. But we can write an issue and if we have time left, we can do it, but I wouldn't create a template now. Are you ok with that?
author_association: CONTRIBUTOR
user: login: Slartibartfass2
created_at: 2025-03-10T12:14:24Z
body: One of your commits is malformed, which is why the Semantic PR check fails.
author_association: CONTRIBUTOR