aboutsummaryrefslogtreecommitdiff
path: root/classes/file.php
blob: f6019eca12196f8bc187a0292153801a901e0993 (plain) (blame)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
/**
 * Provides the file class, an interface to the file table in the database
 * 
 * @author Camil Staps
 * 
 * BusinessAdmin: administrative software for small companies
 * Copyright (C) 2015 Camil Staps (ViviSoft)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * An interface to the file table in the database
 */
class file {
    /**
     * @var PDO $pdo                The PDO class for database communication
     * @var int $id                 The id of the file
     * @var string $filename        The relative path to the file
     */
    protected $pdo, $id, $filename;

    /**
     * Create a new instance
     * 
     * @param PDO $pdo              The PDO class, to access the database
     * @param int $id               The id of the file to fetch
     * 
     * @throws PDOException         If something went wrong with the database
     * @throws Exception            If the file could not be found
     */
    public function __construct($pdo, $id) {
        $this->pdo = $pdo;

        $stmt = $this->pdo->prepare("SELECT * FROM `".constants::db_prefix."file` WHERE `id`=?");
        $stmt->execute(array($id));
        if ($stmt->rowCount() == 0) {
            throw new Exception("The file with id '$id' could not be found.");
        }
        $file = $stmt->fetch(PDO::FETCH_ASSOC);

        $this->id = $file['id'];
        $this->filename = $file['filename'];
    }

    //------------------------------------------------------------------------------
    // Getters and setters
    //------------------------------------------------------------------------------

    /**
     * Get the ID of the file
     * 
     * @return int                  The ID
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Get the relative filename of the file
     * 
     * @see file::getFilenamePath   To get the full internal path to the file
     * @see file::getFilenameURI    To get the full external path to the file
     * 
     * @return string               The filename
     */
    public function getFilename() {
        return $this->filename;
    }

    /**
     * Get the full internal path to the file
     * 
     * @see file::getFilename       To get the relative filename
     * @see file::getFilenameURI    To get the full external path to the file
     * 
     * @return string               The path
     */
    public function getFilenamePath() {
        return constants::files_folder . $this->filename;
    }

    /**
     * Get the full external path to the file
     * 
     * @see file::getFilename       To get the relative filename
     * @see file::getFilenamePath   To get the full internal path to the file
     * 
     * @return string               The URI
     */
    public function getFilenameURI() {
        return constants::files_folder_external . $this->filename;
    }

    //------------------------------------------------------------------------------
    // Other functions
    //------------------------------------------------------------------------------

    /**
     * Move this file to the trash and delete all records for it
     * 
     * Physically, this moves the file to a trash folder
     * Then, the file will be removed from the file table in the database
     * Any appendices linking to this file with fileId will have fileId NULL
     * Any offers linking to this file with invoice_fileId will have invoice_fileId NULL
     * 
     * @throws PDOException         If there's something wrong with the database
     * 
     * @return bool                 True on success, false on failure
     */
    public function delete() {
        // Try to move the file to trash
        $newname = pathinfo($this->filename, PATHINFO_FILENAME) . '--' . date('Y-m-d.H.i.s.') . pathinfo($this->filename, PATHINFO_EXTENSION);
        $newdir = pathinfo($this->getFilenamePath(), PATHINFO_DIRNAME) . '/' . constants::files_folder_trash . '/';
        if (!file_exists($newdir)) {
            if (!mkdir($newdir)) {
                return false;
            }
        }
        if (!(@rename($this->getFilenamePath(), $newdir . $newname))) {
            return false;
        }

        // Remove offers linked by invoice_fileId
        $this->pdo->query("UPDATE `".constants::db_prefix."offer` SET `invoice_fileId`=NULL WHERE `invoice_fileId`={$this->id}");

        // Remove the record of the file
        $stmt = $this->pdo->prepare("DELETE FROM `".constants::db_prefix."file` WHERE `id`=?");
        $stmt->execute(array($this->id));
        if ($stmt->rowCount() == 1) {
            return true;
        } else {
            return false;
        }
    }
}