Completed
Push — master ( 0eca29...e594e9 )
by
unknown
28:51
created
lib/private/Preview/Db/PreviewMapper.php 1 patch
Indentation   +205 added lines, -205 removed lines patch added patch discarded remove patch
@@ -23,209 +23,209 @@
 block discarded – undo
23 23
  */
24 24
 class PreviewMapper extends QBMapper {
25 25
 
26
-	private const TABLE_NAME = 'previews';
27
-	private const LOCATION_TABLE_NAME = 'preview_locations';
28
-	private const VERSION_TABLE_NAME = 'preview_versions';
29
-
30
-	public function __construct(
31
-		IDBConnection $db,
32
-		private readonly IMimeTypeLoader $mimeTypeLoader,
33
-		private readonly IGenerator $snowflake,
34
-	) {
35
-		parent::__construct($db, self::TABLE_NAME, Preview::class);
36
-	}
37
-
38
-	protected function mapRowToEntity(array $row): Entity {
39
-		$row['mimetype'] = $this->mimeTypeLoader->getMimetypeById((int)$row['mimetype_id']);
40
-		$row['source_mimetype'] = $this->mimeTypeLoader->getMimetypeById((int)$row['source_mimetype_id']);
41
-
42
-		return parent::mapRowToEntity($row);
43
-	}
44
-
45
-	#[Override]
46
-	public function insert(Entity $entity): Entity {
47
-		/** @var Preview $preview */
48
-		$preview = $entity;
49
-
50
-		$preview->setMimetypeId($this->mimeTypeLoader->getId($preview->getMimeType()));
51
-		$preview->setSourceMimetypeId($this->mimeTypeLoader->getId($preview->getSourceMimeType()));
52
-
53
-		if ($preview->getVersion() !== null && $preview->getVersion() !== '') {
54
-			$qb = $this->db->getQueryBuilder();
55
-			$id = $this->snowflake->nextId();
56
-			$qb->insert(self::VERSION_TABLE_NAME)
57
-				->values([
58
-					'id' => $qb->createNamedParameter($id),
59
-					'version' => $qb->createNamedParameter($preview->getVersion(), IQueryBuilder::PARAM_STR),
60
-					'file_id' => $qb->createNamedParameter($preview->getFileId()),
61
-				])
62
-				->executeStatement();
63
-			$entity->setVersionId($id);
64
-		}
65
-		return parent::insert($preview);
66
-	}
67
-
68
-	#[Override]
69
-	public function update(Entity $entity): Entity {
70
-		/** @var Preview $preview */
71
-		$preview = $entity;
72
-
73
-		$preview->setMimetypeId($this->mimeTypeLoader->getId($preview->getMimeType()));
74
-		$preview->setSourceMimetypeId($this->mimeTypeLoader->getId($preview->getSourceMimeType()));
75
-
76
-		return parent::update($preview);
77
-	}
78
-
79
-	#[Override]
80
-	public function delete(Entity $entity): Entity {
81
-		/** @var Preview $preview */
82
-		$preview = $entity;
83
-		if ($preview->getVersion() !== null && $preview->getVersion() !== '') {
84
-			$qb = $this->db->getQueryBuilder();
85
-			$qb->delete(self::VERSION_TABLE_NAME)
86
-				->where($qb->expr()->eq('file_id', $qb->createNamedParameter($preview->getFileId())))
87
-				->andWhere($qb->expr()->eq('version', $qb->createNamedParameter($preview->getVersion())))
88
-				->executeStatement();
89
-		}
90
-
91
-		return parent::delete($entity);
92
-	}
93
-
94
-	/**
95
-	 * @return \Generator<Preview>
96
-	 * @throws Exception
97
-	 */
98
-	public function getAvailablePreviewsForFile(int $fileId): \Generator {
99
-		$selectQb = $this->db->getQueryBuilder();
100
-		$this->joinLocation($selectQb)
101
-			->where($selectQb->expr()->eq('p.file_id', $selectQb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
102
-		yield from $this->yieldEntities($selectQb);
103
-	}
104
-
105
-	/**
106
-	 * @param int[] $fileIds
107
-	 * @return array<int, Preview[]>
108
-	 * @throws Exception
109
-	 */
110
-	public function getAvailablePreviews(array $fileIds): array {
111
-		$selectQb = $this->db->getQueryBuilder();
112
-		$this->joinLocation($selectQb)
113
-			->where(
114
-				$selectQb->expr()->in('p.file_id', $selectQb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY)),
115
-			);
116
-		$previews = array_fill_keys($fileIds, []);
117
-		foreach ($this->yieldEntities($selectQb) as $preview) {
118
-			$previews[$preview->getFileId()][] = $preview;
119
-		}
120
-		return $previews;
121
-	}
122
-
123
-	/**
124
-	 * @return \Generator<Preview>
125
-	 */
126
-	public function getByFileId(int $fileId): \Generator {
127
-		$selectQb = $this->db->getQueryBuilder();
128
-		$this->joinLocation($selectQb)
129
-			->where($selectQb->expr()->eq('file_id', $selectQb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
130
-		yield from $this->yieldEntities($selectQb);
131
-	}
132
-
133
-	/**
134
-	 * @param int[] $previewIds
135
-	 */
136
-	public function deleteByIds(array $previewIds): void {
137
-		$qb = $this->db->getQueryBuilder();
138
-		$qb->delete(self::TABLE_NAME)
139
-			->where($qb->expr()->andX(
140
-				$qb->expr()->in('id', $qb->createNamedParameter($previewIds, IQueryBuilder::PARAM_INT_ARRAY))
141
-			))->executeStatement();
142
-	}
143
-
144
-	protected function joinLocation(IQueryBuilder $qb): IQueryBuilder {
145
-		return $qb->select('p.*', 'l.bucket_name', 'l.object_store_name', 'v.version')
146
-			->from(self::TABLE_NAME, 'p')
147
-			->leftJoin('p', self::LOCATION_TABLE_NAME, 'l', $qb->expr()->eq(
148
-				'p.location_id', 'l.id'
149
-			))
150
-			->leftJoin('p', self::VERSION_TABLE_NAME, 'v', $qb->expr()->eq(
151
-				'p.version_id', 'v.id'
152
-			));
153
-	}
154
-
155
-	/**
156
-	 * Get the location id corresponding to the $bucket and $objectStore. Create one
157
-	 * if not existing yet.
158
-	 *
159
-	 * @throws Exception
160
-	 */
161
-	public function getLocationId(string $bucket, string $objectStore): string {
162
-		$qb = $this->db->getQueryBuilder();
163
-		$result = $qb->select('id')
164
-			->from(self::LOCATION_TABLE_NAME)
165
-			->where($qb->expr()->eq('bucket_name', $qb->createNamedParameter($bucket)))
166
-			->andWhere($qb->expr()->eq('object_store_name', $qb->createNamedParameter($objectStore)))
167
-			->executeQuery();
168
-		$data = $result->fetchOne();
169
-		if ($data) {
170
-			return (string)$data;
171
-		} else {
172
-			try {
173
-				$id = $this->snowflake->nextId();
174
-				$qb->insert(self::LOCATION_TABLE_NAME)
175
-					->values([
176
-						'id' => $qb->createNamedParameter($id),
177
-						'bucket_name' => $qb->createNamedParameter($bucket),
178
-						'object_store_name' => $qb->createNamedParameter($objectStore),
179
-					])->executeStatement();
180
-				return $id;
181
-			} catch (Exception $e) {
182
-				if ($e->getReason() === Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
183
-					// Fetch again as there seems to be another entry added meanwhile
184
-					$result = $qb->select('id')
185
-						->from(self::LOCATION_TABLE_NAME)
186
-						->where($qb->expr()->eq('bucket_name', $qb->createNamedParameter($bucket)))
187
-						->andWhere($qb->expr()->eq('object_store_name', $qb->createNamedParameter($objectStore)))
188
-						->executeQuery();
189
-					$data = $result->fetchOne();
190
-					if ($data) {
191
-						return (string)$data;
192
-					}
193
-				}
194
-
195
-				throw $e;
196
-			}
197
-		}
198
-	}
199
-
200
-	public function deleteAll(): void {
201
-		$delete = $this->db->getQueryBuilder();
202
-		$delete->delete($this->getTableName());
203
-	}
204
-
205
-	/**
206
-	 * @return \Generator<Preview>
207
-	 */
208
-	public function getPreviews(int $lastId, int $limit = 1000): \Generator {
209
-		$qb = $this->db->getQueryBuilder();
210
-		$this->joinLocation($qb)
211
-			->where($qb->expr()->gt('p.id', $qb->createNamedParameter($lastId, IQueryBuilder::PARAM_INT)))
212
-			->setMaxResults($limit);
213
-		return $this->yieldEntities($qb);
214
-
215
-	}
216
-
217
-	/**
218
-	 * @param string[] $mimeTypes
219
-	 * @return \Generator<Preview>
220
-	 */
221
-	public function getPreviewsForMimeTypes(array $mimeTypes): \Generator {
222
-		$qb = $this->db->getQueryBuilder();
223
-		$this->joinLocation($qb)
224
-			->where($qb->expr()->orX(
225
-				...array_map(function (string $mimeType) use ($qb): string {
226
-					return $qb->expr()->eq('source_mimetype_id', $qb->createNamedParameter($this->mimeTypeLoader->getId($mimeType), IQueryBuilder::PARAM_INT));
227
-				}, $mimeTypes)
228
-			));
229
-		return $this->yieldEntities($qb);
230
-	}
26
+    private const TABLE_NAME = 'previews';
27
+    private const LOCATION_TABLE_NAME = 'preview_locations';
28
+    private const VERSION_TABLE_NAME = 'preview_versions';
29
+
30
+    public function __construct(
31
+        IDBConnection $db,
32
+        private readonly IMimeTypeLoader $mimeTypeLoader,
33
+        private readonly IGenerator $snowflake,
34
+    ) {
35
+        parent::__construct($db, self::TABLE_NAME, Preview::class);
36
+    }
37
+
38
+    protected function mapRowToEntity(array $row): Entity {
39
+        $row['mimetype'] = $this->mimeTypeLoader->getMimetypeById((int)$row['mimetype_id']);
40
+        $row['source_mimetype'] = $this->mimeTypeLoader->getMimetypeById((int)$row['source_mimetype_id']);
41
+
42
+        return parent::mapRowToEntity($row);
43
+    }
44
+
45
+    #[Override]
46
+    public function insert(Entity $entity): Entity {
47
+        /** @var Preview $preview */
48
+        $preview = $entity;
49
+
50
+        $preview->setMimetypeId($this->mimeTypeLoader->getId($preview->getMimeType()));
51
+        $preview->setSourceMimetypeId($this->mimeTypeLoader->getId($preview->getSourceMimeType()));
52
+
53
+        if ($preview->getVersion() !== null && $preview->getVersion() !== '') {
54
+            $qb = $this->db->getQueryBuilder();
55
+            $id = $this->snowflake->nextId();
56
+            $qb->insert(self::VERSION_TABLE_NAME)
57
+                ->values([
58
+                    'id' => $qb->createNamedParameter($id),
59
+                    'version' => $qb->createNamedParameter($preview->getVersion(), IQueryBuilder::PARAM_STR),
60
+                    'file_id' => $qb->createNamedParameter($preview->getFileId()),
61
+                ])
62
+                ->executeStatement();
63
+            $entity->setVersionId($id);
64
+        }
65
+        return parent::insert($preview);
66
+    }
67
+
68
+    #[Override]
69
+    public function update(Entity $entity): Entity {
70
+        /** @var Preview $preview */
71
+        $preview = $entity;
72
+
73
+        $preview->setMimetypeId($this->mimeTypeLoader->getId($preview->getMimeType()));
74
+        $preview->setSourceMimetypeId($this->mimeTypeLoader->getId($preview->getSourceMimeType()));
75
+
76
+        return parent::update($preview);
77
+    }
78
+
79
+    #[Override]
80
+    public function delete(Entity $entity): Entity {
81
+        /** @var Preview $preview */
82
+        $preview = $entity;
83
+        if ($preview->getVersion() !== null && $preview->getVersion() !== '') {
84
+            $qb = $this->db->getQueryBuilder();
85
+            $qb->delete(self::VERSION_TABLE_NAME)
86
+                ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($preview->getFileId())))
87
+                ->andWhere($qb->expr()->eq('version', $qb->createNamedParameter($preview->getVersion())))
88
+                ->executeStatement();
89
+        }
90
+
91
+        return parent::delete($entity);
92
+    }
93
+
94
+    /**
95
+     * @return \Generator<Preview>
96
+     * @throws Exception
97
+     */
98
+    public function getAvailablePreviewsForFile(int $fileId): \Generator {
99
+        $selectQb = $this->db->getQueryBuilder();
100
+        $this->joinLocation($selectQb)
101
+            ->where($selectQb->expr()->eq('p.file_id', $selectQb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
102
+        yield from $this->yieldEntities($selectQb);
103
+    }
104
+
105
+    /**
106
+     * @param int[] $fileIds
107
+     * @return array<int, Preview[]>
108
+     * @throws Exception
109
+     */
110
+    public function getAvailablePreviews(array $fileIds): array {
111
+        $selectQb = $this->db->getQueryBuilder();
112
+        $this->joinLocation($selectQb)
113
+            ->where(
114
+                $selectQb->expr()->in('p.file_id', $selectQb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY)),
115
+            );
116
+        $previews = array_fill_keys($fileIds, []);
117
+        foreach ($this->yieldEntities($selectQb) as $preview) {
118
+            $previews[$preview->getFileId()][] = $preview;
119
+        }
120
+        return $previews;
121
+    }
122
+
123
+    /**
124
+     * @return \Generator<Preview>
125
+     */
126
+    public function getByFileId(int $fileId): \Generator {
127
+        $selectQb = $this->db->getQueryBuilder();
128
+        $this->joinLocation($selectQb)
129
+            ->where($selectQb->expr()->eq('file_id', $selectQb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
130
+        yield from $this->yieldEntities($selectQb);
131
+    }
132
+
133
+    /**
134
+     * @param int[] $previewIds
135
+     */
136
+    public function deleteByIds(array $previewIds): void {
137
+        $qb = $this->db->getQueryBuilder();
138
+        $qb->delete(self::TABLE_NAME)
139
+            ->where($qb->expr()->andX(
140
+                $qb->expr()->in('id', $qb->createNamedParameter($previewIds, IQueryBuilder::PARAM_INT_ARRAY))
141
+            ))->executeStatement();
142
+    }
143
+
144
+    protected function joinLocation(IQueryBuilder $qb): IQueryBuilder {
145
+        return $qb->select('p.*', 'l.bucket_name', 'l.object_store_name', 'v.version')
146
+            ->from(self::TABLE_NAME, 'p')
147
+            ->leftJoin('p', self::LOCATION_TABLE_NAME, 'l', $qb->expr()->eq(
148
+                'p.location_id', 'l.id'
149
+            ))
150
+            ->leftJoin('p', self::VERSION_TABLE_NAME, 'v', $qb->expr()->eq(
151
+                'p.version_id', 'v.id'
152
+            ));
153
+    }
154
+
155
+    /**
156
+     * Get the location id corresponding to the $bucket and $objectStore. Create one
157
+     * if not existing yet.
158
+     *
159
+     * @throws Exception
160
+     */
161
+    public function getLocationId(string $bucket, string $objectStore): string {
162
+        $qb = $this->db->getQueryBuilder();
163
+        $result = $qb->select('id')
164
+            ->from(self::LOCATION_TABLE_NAME)
165
+            ->where($qb->expr()->eq('bucket_name', $qb->createNamedParameter($bucket)))
166
+            ->andWhere($qb->expr()->eq('object_store_name', $qb->createNamedParameter($objectStore)))
167
+            ->executeQuery();
168
+        $data = $result->fetchOne();
169
+        if ($data) {
170
+            return (string)$data;
171
+        } else {
172
+            try {
173
+                $id = $this->snowflake->nextId();
174
+                $qb->insert(self::LOCATION_TABLE_NAME)
175
+                    ->values([
176
+                        'id' => $qb->createNamedParameter($id),
177
+                        'bucket_name' => $qb->createNamedParameter($bucket),
178
+                        'object_store_name' => $qb->createNamedParameter($objectStore),
179
+                    ])->executeStatement();
180
+                return $id;
181
+            } catch (Exception $e) {
182
+                if ($e->getReason() === Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
183
+                    // Fetch again as there seems to be another entry added meanwhile
184
+                    $result = $qb->select('id')
185
+                        ->from(self::LOCATION_TABLE_NAME)
186
+                        ->where($qb->expr()->eq('bucket_name', $qb->createNamedParameter($bucket)))
187
+                        ->andWhere($qb->expr()->eq('object_store_name', $qb->createNamedParameter($objectStore)))
188
+                        ->executeQuery();
189
+                    $data = $result->fetchOne();
190
+                    if ($data) {
191
+                        return (string)$data;
192
+                    }
193
+                }
194
+
195
+                throw $e;
196
+            }
197
+        }
198
+    }
199
+
200
+    public function deleteAll(): void {
201
+        $delete = $this->db->getQueryBuilder();
202
+        $delete->delete($this->getTableName());
203
+    }
204
+
205
+    /**
206
+     * @return \Generator<Preview>
207
+     */
208
+    public function getPreviews(int $lastId, int $limit = 1000): \Generator {
209
+        $qb = $this->db->getQueryBuilder();
210
+        $this->joinLocation($qb)
211
+            ->where($qb->expr()->gt('p.id', $qb->createNamedParameter($lastId, IQueryBuilder::PARAM_INT)))
212
+            ->setMaxResults($limit);
213
+        return $this->yieldEntities($qb);
214
+
215
+    }
216
+
217
+    /**
218
+     * @param string[] $mimeTypes
219
+     * @return \Generator<Preview>
220
+     */
221
+    public function getPreviewsForMimeTypes(array $mimeTypes): \Generator {
222
+        $qb = $this->db->getQueryBuilder();
223
+        $this->joinLocation($qb)
224
+            ->where($qb->expr()->orX(
225
+                ...array_map(function (string $mimeType) use ($qb): string {
226
+                    return $qb->expr()->eq('source_mimetype_id', $qb->createNamedParameter($this->mimeTypeLoader->getId($mimeType), IQueryBuilder::PARAM_INT));
227
+                }, $mimeTypes)
228
+            ));
229
+        return $this->yieldEntities($qb);
230
+    }
231 231
 }
Please login to merge, or discard this patch.