<?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;
}
}
}