2022-11-17 16:22:48 +01:00
|
|
|
package database
|
|
|
|
|
2022-11-20 19:21:26 +01:00
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/notherealmarco/WASAPhoto/service/structures"
|
|
|
|
)
|
2022-11-17 16:22:48 +01:00
|
|
|
|
|
|
|
// Post a new photo
|
2022-11-20 19:21:26 +01:00
|
|
|
func (db *appdbimpl) PostPhoto(uid string) (DBTransaction, int64, error) {
|
|
|
|
tx, err := db.c.Begin()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := tx.Exec(`INSERT INTO "photos" ("user", "date") VALUES (?, ?)`, uid, time.Now().Format(time.RFC3339))
|
2022-11-17 16:22:48 +01:00
|
|
|
if err != nil {
|
2022-11-20 19:21:26 +01:00
|
|
|
tx.Rollback() // error ?
|
|
|
|
return nil, 0, err
|
2022-11-17 16:22:48 +01:00
|
|
|
}
|
|
|
|
id, err := res.LastInsertId()
|
2022-11-20 19:21:26 +01:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
tx.Rollback() // error ?
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &dbtransaction{
|
|
|
|
c: tx,
|
|
|
|
}, id, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete a photo, returns true if the photo was deleted and false if it did not exist
|
|
|
|
func (db *appdbimpl) DeletePhoto(uid string, photo int64) (bool, error) {
|
|
|
|
res, err := db.c.Exec(`DELETE FROM "photos" WHERE "id" = ? AND "user" = ?`, photo, uid)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
rows, err := res.RowsAffected()
|
2022-11-17 16:22:48 +01:00
|
|
|
if err != nil {
|
2022-11-20 19:21:26 +01:00
|
|
|
return false, err
|
2022-11-17 16:22:48 +01:00
|
|
|
}
|
2022-11-20 19:21:26 +01:00
|
|
|
return rows > 0, nil
|
2022-11-17 16:22:48 +01:00
|
|
|
}
|
|
|
|
|
2022-11-21 19:44:50 +01:00
|
|
|
func (db *appdbimpl) getUserPhotos(uid string) (*[]structures.Photo, error) {
|
2022-11-18 10:54:14 +01:00
|
|
|
|
|
|
|
// Get photos
|
2022-11-21 19:44:50 +01:00
|
|
|
rows, err := db.c.Query(`SELECT "p"."user", "p"."id", "p"."date",
|
|
|
|
(
|
|
|
|
SELECT COUNT(*) AS "likes" FROM "likes" AS "l"
|
|
|
|
WHERE "l"."photo_id" = "p"."id"
|
|
|
|
),
|
|
|
|
(
|
|
|
|
SELECT COUNT(*) AS "comments" FROM "comments" AS "c"
|
|
|
|
WHERE "c"."photo" = "p"."id"
|
|
|
|
)
|
|
|
|
FROM "photos" AS "p"
|
|
|
|
WHERE "p"."user" = ?`, uid)
|
2022-11-18 10:54:14 +01:00
|
|
|
if err != nil {
|
2022-11-21 19:44:50 +01:00
|
|
|
// Return the error
|
2022-11-18 10:54:14 +01:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2022-11-21 19:44:50 +01:00
|
|
|
photos := make([]structures.Photo, 0)
|
|
|
|
|
2022-11-18 10:54:14 +01:00
|
|
|
for rows.Next() {
|
2022-11-21 19:44:50 +01:00
|
|
|
// If there is a next row, we create an instance of Photo and add it to the slice
|
|
|
|
var photo structures.Photo
|
|
|
|
err = rows.Scan(&photo.UID, &photo.ID, &photo.Date, &photo.Likes, &photo.Comments)
|
2022-11-18 10:54:14 +01:00
|
|
|
if err != nil {
|
2022-11-21 19:44:50 +01:00
|
|
|
// Return the error
|
2022-11-18 10:54:14 +01:00
|
|
|
return nil, err
|
|
|
|
}
|
2022-11-21 19:44:50 +01:00
|
|
|
photos = append(photos, photo)
|
2022-11-18 10:54:14 +01:00
|
|
|
}
|
|
|
|
|
2022-11-21 19:44:50 +01:00
|
|
|
return &photos, nil
|
2022-11-17 16:22:48 +01:00
|
|
|
}
|
|
|
|
|
2022-11-20 19:21:26 +01:00
|
|
|
// Check if a given photo owned by a given user exists
|
|
|
|
func (db *appdbimpl) photoExists(uid string, photo int64) (bool, error) {
|
|
|
|
|
|
|
|
var cnt int64
|
|
|
|
err := db.c.QueryRow(`SELECT COUNT(*) FROM "photos" WHERE "id" = ? AND "user" = ?`, photo, uid).Scan(&cnt)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
return cnt > 0, nil
|
|
|
|
}
|