topicId = $topicId; $this->name = $name; } public function getId(): int { return $this->topicId; } public function getName(): string { return $this->name; } } // -- Post Data Models (as previously defined, with setReadCount in Post) -- class Post { private ?Space $space; private ?int $id; private User $creator; private int $postType; private ?int $status; private int $seenCount; private ?DateTime $createdAt; private ?DateTime $updatedAt; public function __construct(?Space $space = null, ?int $id = null, User $creator, int $postType, int $status) { $this->space = $space; $this->id = $id; $this->creator = $creator; $this->postType = $postType; $this->status = $status; $this->seenCount = 0; } public static function exists(int $id): bool { $stmt = 'SELECT count(id) FROM post WHERE id = ?'; $result = exec_stmt($stmt, 'i', $id)->fetch_assoc(); if ($result['count(id)'] == 1) return true; return false; } public static function retrieveFromDB(int $id): ?Post { $stmt = 'SELECT * FROM post WHERE id = ?'; $post = exec_stmt($stmt, 'i', $id)->fetch_assoc(); if ($post) { $creator = User::retrieveFromDB($post['creator']); switch ($post['postType']) { case 1: return new Essay(null, $id, $creator, 1, $post['status'], $post['title'], $post['markdown'], $post['excerpt']); case 3: return new Thought(null, $post['id'], $creator, 3, $post['status'], $post['thought']); } } return null; } public function setId(int $id): void { $this->id = $id; } public function getId(): int { return $this->id; } public function getCreator(): User { return $this->creator; } public function getPostType(): int { return $this->postType; } public function getSeenCount(): int { return $this->seenCount; } public function getCreatedAt(): ?DateTime { return $this->createdAt; } public function getUpdatedAt(): ?DateTime { return $this->updatedAt; } public function getStatus(): ?DateTime { return $this->status; } public function incrementSeenCount(): void { $this->seenCount++; } public function setStatus(?int $status): void { $this->status = $status; } public function setSpace(Space $space): void { $this->space = $space; } public function getSpace(): ?Space { if (!isset($this->space)) { $stmt = 'SELECT space from spacePosts WHERE post = ?'; $rawSpace = exec_stmt($stmt, 'i', $this->id)->fetch_assoc(); } return $this->space; } } class Essay extends Post { private string $title; private string $markdown; private string $excerpt; /* private array $files; */ public function __construct(?Space $space = null, ?int $id = null, User $creator, int $postType, int $status, string $title, string $markdown, string $excerpt) { parent::__construct($space, $id, $creator, 1, $postType, $status); $this->title = $title; $this->excerpt = $excerpt; $this->markdown = $markdown; } public function getCardHTML(): ?string { /* @' . parent::getCreator()->getUsername() . ' */ $html = '
'; return $html; } public function allowUser(User $user): bool { return parent::getSpace()->allowUser($user); } public function getTitle(): ?string { return $this->title; } public function getMarkdown(): ?string { return $this->markdown; } public function getExcerpt(): ?string { return $this->excerpt; } public function setMarkdown(?string $markdown): void { $this->markdown = $markdown; } public function setExcerpt(?string $excerpt): void { $this->excerpt = $excerpt; } public function getSpace(): ?Space { return parent::getSpace(); } } class Moment extends Post { private ?string $caption; private ?array $images; public function __construct(?Space $space = null, ?int $id = null, User $creator, int $postType, int $status, ?array $images = null, ?string $caption = null) { parent::__construct($space, $id, $creator, $postType, $status); $this->caption = $caption; $this->images = $images; } public function getCaption(): ?string { return $this->caption; } public function getImages(): ?array { return $this->images; } public function setCaption(?string $caption): void { $this->caption = $caption; } public function setImages(?array $images): void { $this->images = $images; } } class Thought extends Post { private ?string $thought; public function __construct(?Space $space = null, ?int $id = null, User $creator, int $postType, int $status, string $thought) { parent::__construct($space, $id, $creator, $postType, $status); $this->thought = $thought; if ($id < 0) { $stmt = 'INSERT INTO post (id, parentSpace, creator, postType, status, thought) VALUES (?, ?, ?, ?, ?, ?)'; parent::setId($id * -1); $space = isset($space) ? $space->getId() : $creator->getHomeSpace()->getId(); exec_stmt($stmt, 'iiiiis', $id * -1, $space, $creator->getId(), 3, 2, $this->thought); $stmt = 'INSERT INTO spacePosts (post, space) VALUES (?, ?)'; exec_stmt($stmt, 'ii', $id * -1, $space); } } public function getCardHTML(): ?string { $html = '' . $this->thought . '