summaryrefslogtreecommitdiffstats
path: root/includes/class-giglogadmin-venue.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/class-giglogadmin-venue.php')
-rw-r--r--includes/class-giglogadmin-venue.php176
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;
+ }
+ }
+}