table = $db->prefix . 'us_policies'; } public function insert( Policy $policy ): int { $this->db->insert( $this->table, [ 'title' => $policy->title, 'slug' => $policy->slug, 'current_version_id' => $policy->currentVersionId, 'acceptance_scope' => $policy->acceptanceScope, 'created_at' => current_time( 'mysql' ), ], [ '%s', '%s', '%d', '%s', '%s' ] ); return $this->db->insert_id; } /** * Policies that must be accepted in the given gate — those scoped to it or to * `both`. Pass `Policy::SCOPE_SIGNUP` or `Policy::SCOPE_BOOKING`. * * @return list */ public function findForScope( string $scope ): array { $rows = $this->db->get_results( $this->db->prepare( 'SELECT * FROM %i WHERE acceptance_scope = %s OR acceptance_scope = %s ORDER BY title ASC', $this->table, $scope, Policy::SCOPE_BOTH ) ); return array_map( Policy::fromRow( ... ), $rows ?? [] ); } public function updateCurrentVersion( int $policyId, int $versionId ): bool { return false !== $this->db->update( $this->table, [ 'current_version_id' => $versionId ], [ 'id' => $policyId ], [ '%d' ], [ '%d' ] ); } /** * All policies, ordered by title. * * @return list */ public function findAll(): array { $rows = $this->db->get_results( "SELECT * FROM {$this->table} ORDER BY title ASC" ); return array_map( Policy::fromRow( ... ), $rows ?? [] ); } public function findById( int $id ): ?Policy { $row = $this->db->get_row( $this->db->prepare( 'SELECT * FROM %i WHERE id = %d', $this->table, $id ) ); return $row ? Policy::fromRow( $row ) : null; } public function findBySlug( string $slug ): ?Policy { $row = $this->db->get_row( $this->db->prepare( 'SELECT * FROM %i WHERE slug = %s', $this->table, $slug ) ); return $row ? Policy::fromRow( $row ) : null; } public function delete( int $id ): bool { return (bool) $this->db->delete( $this->table, [ 'id' => $id ], [ '%d' ] ); } }