diff options
Diffstat (limited to 'includes/class-giglogadmin-venue.php')
-rw-r--r-- | includes/class-giglogadmin-venue.php | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/includes/class-giglogadmin-venue.php b/includes/class-giglogadmin-venue.php new file mode 100644 index 0000000..ed148c2 --- /dev/null +++ b/includes/class-giglogadmin-venue.php @@ -0,0 +1,176 @@ +<?php +/** + * Class representing venues. + * + * @package giglogadmin + * + * SPDX-FileCopyrightText: 2021 Andrea Chirulescu <andrea.chirulescu@gmail.com> + * SPDX-FileCopyrightText: 2021 Harald Eilertsen <haraldei@anduin.net> + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +if ( ! class_exists( 'GiglogAdmin_Venue' ) ) { + /** + * Class representing venues. + */ + class GiglogAdmin_Venue { + + private ?int $id; + + /** + * @psalm-suppress PropertyNotSetInConstructor + */ + private string $name; + + /** + * @psalm-suppress PropertyNotSetInConstructor + */ + private string $city; + private ?string $address; + private ?string $webpage; + + /* + * Constructs a new venue object from an array of attributes. + * The attributes are expected to be named as in the database, + * so this constructor can be used to construct the object + * directly from the database row. + */ + public function __construct( object $attrs ) { + $this->id = isset( $attrs->id ) ? $attrs->id : null; + + if ( isset( $attrs->wpgvenue_name, $attrs->wpgvenue_city ) ) { + $this->name = $attrs->wpgvenue_name; + $this->city = $attrs->wpgvenue_city; + } else { + error_log( 'Trying to construct a Venue without a name or a city' ); + wp_die(); + } + + $this->address = isset( $attrs->wpgvenue_address ) ? $attrs->wpgvenue_address : null; + $this->webpage = isset( $attrs->wpgvenue_webpage ) ? $attrs->wpgvenue_webpage : null; + } + + /** + * Get venue by given id. + * + * @param int $id + * @return null|self + */ + static function get( int $id ) : ?self { + global $wpdb; + + $query = $wpdb->prepare( "SELECT * from {$wpdb->prefix}giglogadmin_venues WHERE id = %d", $id ); + $results = $wpdb->get_results( $query ); + + return $results ? new GiglogAdmin_Venue( $results[0] ) : null; + } + + static function create( string $name, string $city = 'Oslo' ): self { + $venue = new GiglogAdmin_Venue( + (object) array( + 'wpgvenue_name' => $name, + 'wpgvenue_city' => $city, + ) + ); + $venue->save(); + + return $venue; + } + + static function find_or_create( string $name, string $city = 'Oslo' ): self { + global $wpdb; + $venuesql = "SELECT * FROM {$wpdb->prefix}giglogadmin_venues " + . $wpdb->prepare( 'WHERE upper(wpgvenue_name)=upper(%s) and upper(wpgvenue_city)=upper(%s)', $name, $city ); + + $results = $wpdb->get_results( $venuesql ); + + if ( $results ) { + return new GiglogAdmin_Venue( $results[0] ); + } else { + return self::create( $name, $city ); + } + } + + static function all_cities(): array { + global $wpdb; + $results = $wpdb->get_results( + "select distinct wpgvenue_city from {$wpdb->prefix}giglogadmin_venues" + ); + + return array_map( + function ( $r ) { + return $r->wpgvenue_city; + }, + $results + ); + } + + /** + * @return self[] + * + * @psalm-return array<array-key, self> + */ + static function all_venues(): array { + global $wpdb; + + $results = $wpdb->get_results( + "select * from {$wpdb->prefix}giglogadmin_venues ORDER BY wpgvenue_name" + ); + + return array_map( + function ( $r ) { + return new GiglogAdmin_Venue( $r ); + }, + $results + ); + } + + + /** + * @return self[] + * + * @psalm-return array<array-key, self> + */ + static function venues_in_city( string $city ): array { + global $wpdb; + $q = $wpdb->prepare( "select * from {$wpdb->prefix}giglogadmin_venues where wpgvenue_city=%s", $city ) + . ' ORDER BY wpgvenue_name'; + $results = $wpdb->get_results( $q ); + + return array_map( + function ( $r ) { + return new GiglogAdmin_Venue( $r ); + }, + $results + ); + } + + public function save(): void { + global $wpdb; + + $wpdb->insert( + $wpdb->prefix . 'giglogadmin_venues', + array( + 'id' => '', + 'wpgvenue_name' => $this->name, + 'wpgvenue_city' => $this->city, + ) + ); + + $this->id = $wpdb->insert_id; + } + + public function id() : int { + return $this->id; + } + + public function name() : string { + return $this->name; + } + + public function city() : string { + return $this->city; + } + } +} |