summaryrefslogtreecommitdiff
path: root/src/db/rest
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/rest')
-rw-r--r--src/db/rest/media/_api_serve_system_media.sql (renamed from src/db/rest/util/_api_serve_media.sql)20
-rw-r--r--src/db/rest/media/_api_serve_user_media.sql37
-rw-r--r--src/db/rest/media/_api_serve_user_or_default_media.sql41
-rw-r--r--src/db/rest/media/api_profile_avatar.sql30
-rw-r--r--src/db/rest/media/api_profile_banner.sql13
-rw-r--r--src/db/rest/post/api_post.sql15
-rw-r--r--src/db/rest/rest.sql4
-rw-r--r--src/db/rest/user/api_user.sql67
-rw-r--r--src/db/rest/util/_api_raise_not_found.sql16
9 files changed, 204 insertions, 39 deletions
diff --git a/src/db/rest/util/_api_serve_media.sql b/src/db/rest/media/_api_serve_system_media.sql
index c2e213a..5cd87c2 100644
--- a/src/db/rest/util/_api_serve_media.sql
+++ b/src/db/rest/media/_api_serve_system_media.sql
@@ -1,4 +1,4 @@
-CREATE FUNCTION _api.serve_media(
+CREATE FUNCTION _api.serve_system_media(
_media_id INTEGER
)
RETURNS sys."*/*"
@@ -8,34 +8,30 @@ DECLARE
_headers TEXT;
_data BYTEA;
BEGIN
-
SELECT FORMAT(
'[{"Content-Type": "%s"},'
'{"Content-Disposition": "inline; filename=\"%s\""},'
'{"Cache-Control": "max-age=259200"}]'
- , m.type, m.name)
+ , m.mime, m.name)
FROM admin.media m
- WHERE m.id = _media_id INTO _headers;
-
- PERFORM SET_CONFIG('response.headers', _headers, true);
+ WHERE m.id = _media_id
+ INTO _headers;
SELECT m.content
FROM admin.media m
WHERE m.id = _media_id
INTO _data;
- IF FOUND THEN
+ IF _data IS NOT NULL THEN
+ PERFORM SET_CONFIG('response.headers', _headers, true);
RETURN(_data);
ELSE
- PERFORM _api.raise(
- _msg => 'api_not_found',
- _err => 404
- );
+ PERFORM _api.raise_not_found();
END IF;
END
$BODY$;
-GRANT EXECUTE ON FUNCTION _api.serve_media(INTEGER)
+GRANT EXECUTE ON FUNCTION _api.serve_system_media(INTEGER)
TO rest_anon, rest_user;
GRANT SELECT ON TABLE admin.media
TO rest_anon, rest_user;
diff --git a/src/db/rest/media/_api_serve_user_media.sql b/src/db/rest/media/_api_serve_user_media.sql
new file mode 100644
index 0000000..3487493
--- /dev/null
+++ b/src/db/rest/media/_api_serve_user_media.sql
@@ -0,0 +1,37 @@
+CREATE FUNCTION _api.serve_user_media(
+ _media_id INTEGER
+)
+RETURNS sys."*/*"
+LANGUAGE plpgsql VOLATILE
+AS $BODY$
+DECLARE
+ _headers TEXT;
+ _data BYTEA;
+BEGIN
+ SELECT FORMAT(
+ '[{"Content-Type": "%s"},'
+ '{"Content-Disposition": "inline"},'
+ '{"Cache-Control": "max-age=259200"}]'
+ , m.mime)
+ FROM admin.user_media m
+ WHERE m.id = _media_id
+ INTO _headers;
+
+ SELECT m.content
+ FROM admin.user_media m
+ WHERE m.id = _media_id
+ INTO _data;
+
+ IF _data IS NOT NULL THEN
+ PERFORM SET_CONFIG('response.headers', _headers, true);
+ RETURN(_data);
+ ELSE
+ PERFORM _api.raise_not_found();
+ END IF;
+END
+$BODY$;
+
+GRANT EXECUTE ON FUNCTION _api.serve_user_media(INTEGER)
+ TO rest_anon, rest_user;
+GRANT SELECT ON TABLE admin.user_media
+ TO rest_anon, rest_user;
diff --git a/src/db/rest/media/_api_serve_user_or_default_media.sql b/src/db/rest/media/_api_serve_user_or_default_media.sql
new file mode 100644
index 0000000..c079ba9
--- /dev/null
+++ b/src/db/rest/media/_api_serve_user_or_default_media.sql
@@ -0,0 +1,41 @@
+CREATE FUNCTION _api.serve_user_or_default_media(
+ _user_id INTEGER,
+ _type admin.user_media_type,
+ _default TEXT
+)
+RETURNS sys."*/*"
+LANGUAGE plpgsql VOLATILE
+AS $BODY$
+DECLARE
+ _media_id INTEGER;
+BEGIN
+
+ SELECT id
+ FROM admin.user_media m
+ WHERE m.type = _type
+ AND m.user_id = _user_id
+ INTO _media_id;
+
+ IF FOUND THEN
+ RETURN _api.serve_user_media(_media_id);
+ END IF;
+
+ SELECT id
+ FROM admin.media m
+ WHERE m.name = _default
+ INTO _media_id;
+
+ IF FOUND THEN
+ RETURN _api.serve_system_media(_media_id);
+ END IF;
+
+ PERFORM _api_raise_not_found();
+END
+$BODY$;
+
+GRANT EXECUTE ON FUNCTION _api.serve_user_or_default_media(INTEGER, admin.user_media_type, TEXT)
+ TO rest_anon, rest_user;
+GRANT SELECT ON TABLE admin.user_media
+ TO rest_anon, rest_user;
+GRANT SELECT ON TABLE admin.media
+ TO rest_anon, rest_user;
diff --git a/src/db/rest/media/api_profile_avatar.sql b/src/db/rest/media/api_profile_avatar.sql
index 8607999..b3e456c 100644
--- a/src/db/rest/media/api_profile_avatar.sql
+++ b/src/db/rest/media/api_profile_avatar.sql
@@ -5,32 +5,16 @@ RETURNS sys."*/*"
LANGUAGE plpgsql VOLATILE
AS $BODY$
DECLARE
- _id INTEGER;
- _mod INTEGER;
- _name TEXT;
+ _default TEXT;
BEGIN
- SELECT media_id INTO _id
- FROM admin.user_media m
- WHERE m.user_id = profile_avatar.user_id
- AND type = 'avatar'::admin.user_media_type;
-
- -- get default if not exists
- IF NOT FOUND THEN
- _mod = MOD(user_id, 24);
- _name = 'default_avatar_' || _mod || '.png';
-
- SELECT id INTO _id
- FROM admin.media
- WHERE name = _name;
- END IF;
-
- RETURN _api.serve_media(_id);
+ _default := 'default_avatar_' || MOD(user_id, 25) || '.png';
+ RETURN _api.serve_user_or_default_media(
+ user_id,
+ 'avatar'::admin.user_media_type,
+ _default
+ );
END
$BODY$;
GRANT EXECUTE ON FUNCTION api.profile_avatar(INTEGER)
TO rest_anon, rest_user;
-GRANT SELECT ON TABLE admin.user_media
- TO rest_anon, rest_user;
-GRANT SELECT ON TABLE admin.media
- TO rest_anon, rest_user;
diff --git a/src/db/rest/media/api_profile_banner.sql b/src/db/rest/media/api_profile_banner.sql
index 272d021..d98f553 100644
--- a/src/db/rest/media/api_profile_banner.sql
+++ b/src/db/rest/media/api_profile_banner.sql
@@ -4,10 +4,21 @@ CREATE FUNCTION api.profile_banner(
RETURNS sys."*/*"
LANGUAGE plpgsql VOLATILE
AS $BODY$
+DECLARE
+ _default TEXT;
BEGIN
- PERFORM _api.raise_deny();
+ _default := 'default_banner_' || MOD(user_id, 25) || '.png';
+ RETURN _api.serve_user_or_default_media(
+ user_id,
+ 'banner'::admin.user_media_type,
+ _default
+ );
END
$BODY$;
GRANT EXECUTE ON FUNCTION api.profile_banner(INTEGER)
TO rest_anon, rest_user;
+GRANT SELECT ON TABLE admin.user_media
+ TO rest_anon, rest_user;
+GRANT SELECT ON TABLE admin.media
+ TO rest_anon, rest_user;
diff --git a/src/db/rest/post/api_post.sql b/src/db/rest/post/api_post.sql
index 0d60473..b5c42a8 100644
--- a/src/db/rest/post/api_post.sql
+++ b/src/db/rest/post/api_post.sql
@@ -6,7 +6,9 @@ CREATE VIEW api.post AS
p.created,
p.modified,
COALESCE(c.cc, 0)
- AS comment_count
+ AS comment_count,
+ COALESCE(l.lc, 0)
+ AS like_count
FROM
admin.post p
LEFT JOIN (
@@ -20,6 +22,17 @@ CREATE VIEW api.post AS
) c
ON
p.id = c.post_id
+ LEFT JOIN (
+ SELECT
+ COUNT(l.id) as lc,
+ l.post_id
+ FROM
+ admin.like l
+ GROUP BY
+ l.post_id
+ ) l
+ ON
+ p.id = l.post_id
LEFT JOIN
admin.user u
ON
diff --git a/src/db/rest/rest.sql b/src/db/rest/rest.sql
index e203f27..783866a 100644
--- a/src/db/rest/rest.sql
+++ b/src/db/rest/rest.sql
@@ -15,7 +15,6 @@ GRANT USAGE ON SCHEMA _api TO rest_anon, rest_user;
-- util
\i /db/rest/util/_api_trim.sql;
-\i /db/rest/util/_api_serve_media.sql;
\i /db/rest/util/_api_raise.sql;
\i /db/rest/util/_api_raise_null.sql;
\i /db/rest/util/_api_raise_unique.sql;
@@ -47,6 +46,9 @@ GRANT USAGE ON SCHEMA _api TO rest_anon, rest_user;
\i /db/rest/like/api_like_delete.sql;
-- media
+\i /db/rest/media/_api_serve_user_media.sql;
+\i /db/rest/media/_api_serve_system_media.sql;
+\i /db/rest/media/_api_serve_user_or_default_media.sql;
\i /db/rest/media/api_profile_avatar.sql;
\i /db/rest/media/api_profile_banner.sql;
diff --git a/src/db/rest/user/api_user.sql b/src/db/rest/user/api_user.sql
index 6735775..d71fd1b 100644
--- a/src/db/rest/user/api_user.sql
+++ b/src/db/rest/user/api_user.sql
@@ -13,9 +13,74 @@ CREATE VIEW api.user AS
u.profile_bio,
u.created,
u.modified,
- u.seen
+ u.seen,
+ COALESCE(f.fc, 0)
+ AS follower_count,
+ COALESCE(fl.fc, 0)
+ AS followed_count,
+ COALESCE(c.cc, 0)
+ AS comment_count,
+ COALESCE(p.pc, 0)
+ AS post_count,
+ COALESCE(l.lc, 0)
+ AS like_count
FROM
admin.user u
+ LEFT JOIN (
+ SELECT
+ COUNT(f.id) as fc,
+ f.followee_id
+ FROM
+ admin.follow f
+ GROUP BY
+ f.followee_id
+ ) f
+ ON
+ u.id = f.followee_id
+ LEFT JOIN (
+ SELECT
+ COUNT(fl.id) as fc,
+ fl.follower_id
+ FROM
+ admin.follow fl
+ GROUP BY
+ fl.follower_id
+ ) fl
+ ON
+ u.id = fl.follower_id
+ LEFT JOIN (
+ SELECT
+ COUNT(c.id) as cc,
+ c.user_id
+ FROM
+ admin.comment c
+ GROUP BY
+ c.user_id
+ ) c
+ ON
+ u.id = c.user_id
+ LEFT JOIN (
+ SELECT
+ COUNT(p.id) as pc,
+ p.user_id
+ FROM
+ admin.post p
+ GROUP BY
+ p.user_id
+ ) p
+ ON
+ u.id = p.user_id
+ LEFT JOIN (
+ SELECT
+ COUNT(l.id) as lc,
+ l.user_id
+ FROM
+ admin.like l
+ GROUP BY
+ l.user_id
+ ) l
+ ON
+ u.id = l.user_id
WHERE
u.deleted <> TRUE;
diff --git a/src/db/rest/util/_api_raise_not_found.sql b/src/db/rest/util/_api_raise_not_found.sql
new file mode 100644
index 0000000..f4997a6
--- /dev/null
+++ b/src/db/rest/util/_api_raise_not_found.sql
@@ -0,0 +1,16 @@
+CREATE FUNCTION _api.raise_not_found()
+RETURNS BOOLEAN
+LANGUAGE plpgsql VOLATILE
+AS $BODY$
+BEGIN
+ PERFORM _api.raise(
+ _msg => 'api_not_found',
+ _err => 404
+ );
+
+ RETURN TRUE;
+END
+$BODY$;
+
+GRANT EXECUTE ON FUNCTION _api.raise_not_found()
+ TO rest_anon, rest_user;