aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet.pm
blob: f581631cf05b5d93f792eb913ec28240d75462f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package FixMyStreet;

use strict;
use warnings;

use Path::Class;
my $ROOT_DIR = file(__FILE__)->parent->parent->absolute->resolve;

use Readonly;

use mySociety::Config;

# load the config file and store the contents in a readonly hash
mySociety::Config::set_file( __PACKAGE__->path_to("conf/general") );
Readonly::Hash my %CONFIG, %{ mySociety::Config::get_list() };

=head1 NAME

FixMyStreet

=head1 DESCRIPTION

FixMyStreet is a webite where you can report issues and have them routed to the
correct authority so that they can be fixed.

Thus module has utility functions for the FMS project.

=head1 METHODS

=head2 test_mode

    FixMyStreet->test_mode( $bool );
    my $in_test_mode_bool = FixMyStreet->test_mode;

Put the FixMyStreet into test mode - inteded for the unit tests:

    BEGIN {
        use FixMyStreet;
        FixMyStreet->test_mode(1);
    }

=cut

my $TEST_MODE = undef;

sub test_mode {
    my $class = shift;
    $TEST_MODE = shift if scalar @_;
    return $TEST_MODE;
}

=head2 path_to

    $path = FixMyStreet->path_to( 'conf/general' );

Returns an absolute Path::Class object representing the path to the arguments in
the FixMyStreet directory.

=cut

sub path_to {
    my $class = shift;
    return $ROOT_DIR->file(@_);
}

=head2 config

    my $config_hash_ref = FixMyStreet->config();
    my $config_value    = FixMyStreet->config($key);

Returns a hashref to the config values. This is readonly so any attempt to
change it will fail.

Or you can pass it a key and it will return the value for that key, or undef if
it can't find it.

=cut

sub config {
    my $class = shift;
    return \%CONFIG unless scalar @_;

    my $key = shift;
    return exists $CONFIG{$key} ? $CONFIG{$key} : undef;
}

=head2 dbic_connect_info

    $connect_info = FixMyStreet->dbic_connect_info();

Returns the array that DBIx::Class::Schema needs to connect to the database.
Most of the values are read from the config file and others are hordcoded here.

=cut

# for exact details on what this could return refer to:
#
# http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Storage/DBI.pm#connect_info
#
# we use the one that is most similar to DBI's connect.

sub dbic_connect_info {
    my $class  = shift;
    my $config = $class->config;

    my $dsn = "dbi:Pg:dbname=" . $config->{BCI_DB_NAME};
    $dsn .= ";host=$config->{BCI_DB_HOST}"
      if $config->{BCI_DB_HOST};
    $dsn .= ";port=$config->{BCI_DB_PORT}"
      if $config->{BCI_DB_PORT};
    $dsn .= ";sslmode=allow";

    my $user     = $config->{BCI_DB_USER} || undef;
    my $password = $config->{BCI_DB_PASS} || undef;

    my $dbi_args = {
        AutoCommit     => 1,
        pg_enable_utf8 => 1,
    };
    my $dbic_args = {};

    return [ $dsn, $user, $password, $dbi_args, $dbic_args ];
}

1;