table = $db->prefix . 'us_policy_versions'; } public function insert( PolicyVersion $version ): int { $this->db->insert( $this->table, [ 'policy_id' => $version->policyId, 'version_number' => $version->versionNumber, 'body' => $version->body, 'status' => $version->status, 'published_at' => $version->publishedAt, 'created_at' => current_time( 'mysql' ), ], [ '%d', '%d', '%s', '%s', '%s', '%s' ] ); return $this->db->insert_id; } public function updateBody( int $id, ?string $body ): bool { return false !== $this->db->update( $this->table, [ 'body' => $body ], [ 'id' => $id ], [ '%s' ], [ '%d' ] ); } public function updateStatus( int $id, string $status, ?string $publishedAt = null ): bool { return false !== $this->db->update( $this->table, [ 'status' => $status, 'published_at' => $publishedAt, ], [ 'id' => $id ], [ '%s', '%s' ], [ '%d' ] ); } /** * All versions of a policy, newest version number first. * * @return list */ public function findByPolicy( int $policyId ): array { $rows = $this->db->get_results( $this->db->prepare( 'SELECT * FROM %i WHERE policy_id = %d ORDER BY version_number DESC', $this->table, $policyId ) ); return array_map( PolicyVersion::fromRow( ... ), $rows ?? [] ); } public function findById( int $id ): ?PolicyVersion { $row = $this->db->get_row( $this->db->prepare( 'SELECT * FROM %i WHERE id = %d', $this->table, $id ) ); return $row ? PolicyVersion::fromRow( $row ) : null; } /** * Highest version_number assigned for a policy (0 when none exist yet). */ public function maxVersionNumber( int $policyId ): int { $max = $this->db->get_var( $this->db->prepare( 'SELECT MAX(version_number) FROM %i WHERE policy_id = %d', $this->table, $policyId ) ); return null === $max ? 0 : (int) $max; } }