diff --git a/src/main/java/edu/group5/app/model/Repository.java b/src/main/java/edu/group5/app/model/Repository.java
new file mode 100644
index 0000000..d0d2792
--- /dev/null
+++ b/src/main/java/edu/group5/app/model/Repository.java
@@ -0,0 +1,20 @@
+package edu.group5.app.model;
+
+/**
+ * Represents a repository
+ */
+public abstract class Repository {
+ protected final Object content;
+
+ public Repository(Object content) {
+ this.content = content;
+ }
+
+ /**
+ * Gets the content of the repo
+ * @return content of the repo
+ */
+ public Object getContent() {
+ return content;
+ }
+}
diff --git a/src/main/java/edu/group5/app/model/organization/Organization.java b/src/main/java/edu/group5/app/model/organization/Organization.java
index 825945f..885f0ed 100644
--- a/src/main/java/edu/group5/app/model/organization/Organization.java
+++ b/src/main/java/edu/group5/app/model/organization/Organization.java
@@ -1,5 +1,50 @@
package edu.group5.app.model.organization;
-public class Organization {
-
+import java.util.Objects;
+
+/**
+ * Represents an organization.
+ *
+ *
An organization is identified by an organization number, a name,
+ * trust status, website URL, pre-approval status, and a textual description.
+ *
+ *
Instances are validated on creation:
+ *
+ * - orgNumber must be non-negative
+ * - name and websiteURL must not be null or blank
+ * - description must not be null
+ *
+ */
+public record Organization(int orgNumber, String name, boolean trusted, String websiteURL, boolean isPreApproved,
+ String description) {
+ /**
+ * Creates a new organization.
+ *
+ * @param orgNumber the organization number; must be non-negative
+ * @param name the organization name; must not be null or blank
+ * @param trusted whether the organization is trusted
+ * @param websiteURL the organization's website URL; must not be null or blank
+ * @param isPreApproved whether the organization is pre-approved
+ * @param description a textual description of the organization; must not be null
+ * @throws NullPointerException if name, websiteURL or description is null
+ * @throws IllegalArgumentException if orgNumber is negative, or if name or websiteURL is blank
+ */
+ public Organization(int orgNumber, String name, boolean trusted, String websiteURL, boolean isPreApproved, String description) {
+ if (orgNumber < 0) {
+ throw new IllegalArgumentException("orgNumber cannot be negative");
+ }
+ this.orgNumber = orgNumber;
+ this.name = Objects.requireNonNull(name, "name cannot be null");
+ this.trusted = trusted;
+ this.websiteURL = Objects.requireNonNull(websiteURL, "websiteURL cannot be null");
+ this.isPreApproved = isPreApproved;
+ this.description = Objects.requireNonNull(description, "description cannot be null");
+
+ if (name.isBlank()) {
+ throw new IllegalArgumentException("name cannot be blank");
+ }
+ if (websiteURL.isBlank()) {
+ throw new IllegalArgumentException("websiteURL cannot be blank");
+ }
+ }
}
diff --git a/src/main/java/edu/group5/app/model/organization/OrganizationRepo.java b/src/main/java/edu/group5/app/model/organization/OrganizationRepo.java
new file mode 100644
index 0000000..27b128f
--- /dev/null
+++ b/src/main/java/edu/group5/app/model/organization/OrganizationRepo.java
@@ -0,0 +1,40 @@
+package edu.group5.app.model.organization;
+
+import edu.group5.app.model.Repository;
+
+import java.util.HashMap;
+import java.util.Objects;
+
+/**
+ * Handles business logic associated with organizations
+ */
+public class OrganizationRepo extends Repository {
+ private final HashMap content;
+
+ /**
+ * Creates a new Organization Repository
+ *
+ * @param content holds all current organizations in the repository
+ * @throws NullPointerException if content is null
+ */
+ public OrganizationRepo(HashMap content) {
+ this.content = Objects.requireNonNull(content, "content cannot be null");
+ super(content);
+ }
+
+ /**
+ * Gets all trusted organizations in the repository
+ * @return all organizations with trusted = true
+ */
+ public HashMap getTrustedOrganizations() {
+ HashMap trustedOrgs = new HashMap<>();
+
+ content.forEach((orgNr, org) -> {
+ if (org.trusted()) {
+ trustedOrgs.put(orgNr, org);
+ }
+ });
+
+ return trustedOrgs;
+ }
+}
diff --git a/src/test/java/edu/group5/app/model/organization/OrganizationRepoTest.java b/src/test/java/edu/group5/app/model/organization/OrganizationRepoTest.java
new file mode 100644
index 0000000..780bf8e
--- /dev/null
+++ b/src/test/java/edu/group5/app/model/organization/OrganizationRepoTest.java
@@ -0,0 +1,4 @@
+import static org.junit.jupiter.api.Assertions.*;
+class OrganizationRepoTest {
+
+}
\ No newline at end of file
diff --git a/src/test/java/edu/group5/app/model/organization/OrganizationTest.java b/src/test/java/edu/group5/app/model/organization/OrganizationTest.java
new file mode 100644
index 0000000..3b086c3
--- /dev/null
+++ b/src/test/java/edu/group5/app/model/organization/OrganizationTest.java
@@ -0,0 +1,86 @@
+package edu.group5.app.model.organization;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class OrganizationTest {
+
+ @Test
+ void constructor_ThrowsWhenOrgNumberIsNegative() {
+ assertThrows(IllegalArgumentException.class, () -> {new Organization(
+ -1,
+ "Org",
+ true,
+ null,
+ true,
+ "Org description"
+ );
+ });
+ }
+
+ @Test
+ void constructor_ThrowsWhenNameIsNull() {
+ assertThrows(NullPointerException.class, () -> {new Organization(
+ 1,
+ null,
+ true,
+ "org.com",
+ true,
+ "Org description"
+ );
+ });
+ }
+
+ @Test
+ void constructor_ThrowsWhenNameIsBlank() {
+ assertThrows(IllegalArgumentException.class, () -> {new Organization(
+ 1,
+ "",
+ true,
+ "org.com",
+ true,
+ "Org description"
+ );
+ });
+ }
+
+ @Test
+ void constructor_ThrowsWhenWebsiteURLIsNull() {
+ assertThrows(NullPointerException.class, () -> {new Organization(
+ 1,
+ "Org",
+ true,
+ null,
+ true,
+ "Org description"
+ );
+ });
+ }
+
+ @Test
+ void constructor_ThrowsWhenWebsiteURLIsBlank() {
+ assertThrows(IllegalArgumentException.class, () -> {new Organization(
+ 1,
+ "Org",
+ true,
+ "",
+ true,
+ "Org description"
+ );
+ });
+ }
+
+ @Test
+ void constructor_ThrowsWhenDescriptionIsNull() {
+ assertThrows(NullPointerException.class, () -> {new Organization(
+ 1,
+ "Org",
+ true,
+ "org.com",
+ true,
+ null
+ );
+ });
+ }
+}
\ No newline at end of file