1
0
Fork 0
mirror of https://github.com/Nutomic/ibis.git synced 2024-12-23 16:51:24 +00:00
ibis/migrations/2024-12-18-214511_site-stats/up.sql

135 lines
2.7 KiB
PL/PgSQL

CREATE TABLE instance_stats (
id serial PRIMARY KEY,
users int NOT NULL DEFAULT 0,
users_active_month int NOT NULL DEFAULT 0,
users_active_half_year int NOT NULL DEFAULT 0,
articles int NOT NULL DEFAULT 0
);
INSERT INTO instance_stats (users, articles)
SELECT
(SELECT count(*) FROM local_user) AS users,
(SELECT count(*) FROM article WHERE local = TRUE) AS article
FROM instance;
CREATE FUNCTION instance_stats_local_user_insert ()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE
instance_stats
SET
users = users + 1;
RETURN NULL;
END
$$;
CREATE FUNCTION instance_stats_local_user_delete ()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE
instance_stats sa
SET
users = users - 1
FROM
instance s
WHERE
sa.instance_id = s.id;
RETURN NULL;
END
$$;
CREATE TRIGGER instance_stats_local_user_insert
AFTER INSERT ON local_user
FOR EACH ROW
EXECUTE PROCEDURE instance_stats_local_user_insert ();
CREATE TRIGGER instance_stats_local_user_delete
AFTER DELETE ON local_user
FOR EACH ROW
EXECUTE PROCEDURE instance_stats_local_user_delete ();
CREATE FUNCTION instance_stats_article_insert ()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE
instance_stats
SET
articles = articles + 1;
RETURN NULL;
END
$$;
CREATE FUNCTION instance_stats_article_delete ()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE
instance_stats ia
SET
articles = articles - 1
FROM
instance i
WHERE
ia.instance_id = i.id;
RETURN NULL;
END
$$;
CREATE TRIGGER instance_stats_article_insert
AFTER INSERT ON article
FOR EACH ROW
WHEN (NEW.local = TRUE)
EXECUTE PROCEDURE instance_stats_article_insert ();
CREATE TRIGGER instance_stats_article_delete
AFTER DELETE ON article
FOR EACH ROW
WHEN (OLD.local = TRUE)
EXECUTE PROCEDURE instance_stats_article_delete ();
CREATE OR REPLACE FUNCTION instance_stats_activity (i text)
RETURNS int
LANGUAGE plpgsql
AS $$
DECLARE
count_ integer;
BEGIN
SELECT
count(*) INTO count_
FROM (
SELECT
e.creator_id
FROM
edit e
INNER JOIN person p ON e.creator_id = p.id
WHERE
e.published > ('now'::timestamp - i::interval)
AND p.local = TRUE);
RETURN count_;
END;
$$;
UPDATE
instance_stats
SET
users_active_month = (
SELECT
*
FROM
instance_stats_activity ('1 month'));
UPDATE
instance_stats
SET
users_active_half_year = (
SELECT
*
FROM
instance_stats_activity ('6 months'));