mirror of
https://github.com/notherealmarco/WASAPhoto.git
synced 2025-03-13 13:35:23 +01:00
121 lines
3.2 KiB
Go
121 lines
3.2 KiB
Go
package database
|
|
|
|
import (
|
|
"github.com/notherealmarco/WASAPhoto/service/database/db_errors"
|
|
"github.com/notherealmarco/WASAPhoto/service/structures"
|
|
)
|
|
|
|
// Get user profile, including username, followers, following, and photos
|
|
func (db *appdbimpl) GetUserProfile(uid string, requesting_uid string) (QueryResult, *structures.UserProfile, error) {
|
|
// Get user info
|
|
var name string
|
|
err := db.c.QueryRow(`SELECT "name" FROM "users" WHERE "uid" = ?`, uid).Scan(&name)
|
|
|
|
if db_errors.EmptySet(err) {
|
|
// Query returned no rows, the user does not exist
|
|
return ERR_NOT_FOUND, nil, nil
|
|
|
|
} else if err != nil {
|
|
return ERR_INTERNAL, nil, err
|
|
}
|
|
|
|
// Get followers
|
|
var followers int64
|
|
err = db.c.QueryRow(`SELECT COUNT(*) FROM "follows" WHERE "followed" = ?`, uid).Scan(&followers)
|
|
|
|
if err != nil {
|
|
// Return the error
|
|
return ERR_INTERNAL, nil, err
|
|
}
|
|
|
|
// Get following users
|
|
var following int64
|
|
err = db.c.QueryRow(`SELECT COUNT(*) FROM "follows" WHERE "follower" = ?`, uid).Scan(&following)
|
|
|
|
if err != nil {
|
|
// Return the error
|
|
return ERR_INTERNAL, nil, err
|
|
}
|
|
|
|
var photos int64
|
|
err = db.c.QueryRow(`SELECT COUNT(*) FROM "photos" WHERE "photos"."user" = ?`, uid).Scan(&photos)
|
|
|
|
if err != nil {
|
|
return ERR_INTERNAL, nil, err
|
|
}
|
|
|
|
// Get follow status
|
|
var follow_status bool
|
|
err = db.c.QueryRow(`SELECT EXISTS (SELECT * FROM "follows" WHERE "follower" = ? AND "followed" = ?)`, requesting_uid, uid).Scan(&follow_status)
|
|
|
|
if err != nil {
|
|
return ERR_INTERNAL, nil, err
|
|
}
|
|
|
|
// Get ban status
|
|
var ban_status bool
|
|
err = db.c.QueryRow(`SELECT EXISTS (SELECT * FROM "bans" WHERE "user" = ? AND "ban" = ?)`, requesting_uid, uid).Scan(&ban_status)
|
|
|
|
if err != nil {
|
|
return ERR_INTERNAL, nil, err
|
|
}
|
|
|
|
return SUCCESS, &structures.UserProfile{
|
|
UID: uid,
|
|
Name: name,
|
|
Following: following,
|
|
Followers: followers,
|
|
Followed: follow_status,
|
|
Banned: ban_status,
|
|
Photos: photos,
|
|
}, nil
|
|
}
|
|
|
|
func (db *appdbimpl) GetUserPhotos(uid string, requesting_uid string, start_index int, limit int) (*[]structures.UserPhoto, error) {
|
|
|
|
// Get photos
|
|
rows, err := db.c.Query(`SELECT "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"
|
|
),
|
|
EXISTS (
|
|
SELECT * FROM "likes" AS "l"
|
|
WHERE "l"."photo_id" = "p"."id"
|
|
AND "l"."user" = ?
|
|
)
|
|
FROM "photos" AS "p"
|
|
WHERE "p"."user" = ?
|
|
ORDER BY "p"."date" DESC
|
|
LIMIT ?
|
|
OFFSET ?`, requesting_uid, uid, limit, start_index)
|
|
if err != nil {
|
|
// Return the error
|
|
return nil, err
|
|
}
|
|
|
|
photos := make([]structures.UserPhoto, 0)
|
|
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
// If there is a next row, we create an instance of Photo and add it to the slice
|
|
var photo structures.UserPhoto
|
|
err = rows.Scan(&photo.ID, &photo.Date, &photo.Likes, &photo.Comments, &photo.Liked)
|
|
if err != nil {
|
|
// Return the error
|
|
return nil, err
|
|
}
|
|
photos = append(photos, photo)
|
|
}
|
|
// We check if the iteration ended prematurely
|
|
if err = rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &photos, nil
|
|
}
|