summaryrefslogblamecommitdiffstats
path: root/includes/class-giglogadmin-venue.php
blob: ed148c2f16aa44b19b797d4418415ba9c7fff94d (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
     









                                                                               
 
                                              


                                 

                             
                         









                                                      

                                 






                                                                      

                                                                
 
                                                                          

                                                    

                                                                                    


                         

                                                                                                 
         
 


                                 

                            
           
                                                

                         

                                                                                                            
 
                                                                          

         






                                                                             
                           
 
                          

         
                                                                                     
                         
                                                                          
                                                                                                                            
 
                                                        
 



                                                            
             

         
                                             
                         
                                          








                                                                                      

         




                                               
                                             

                         
                                          








                                                                                        


         




                                               
                                                               
                         









                                                                                                                  

         
                                      

                         







                                                                       



                                         
                                    
                              

         
                                         
                                

         
                                         
                                


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