You can use common table expressions for such of requirements. See:
WITH RECURSIVE alldays as
(
SELECT CAST('2021-06-21' as timestamp without time zone) currdate,
CAST('2021-06-21' as timestamp without time zone) + 30 * interval '1 day' maxdate
UNION ALL
SELECT a.currdate + interval '1 day' currdate, a.maxdate
FROM alldays a
WHERE a.currdate + interval '1 day' <= a.maxdate
),
allusers as
(
SELECT DISTINCT userid
FROM mydata
)
SELECT u.userid, d.currdate dates
FROM allusers u CROSS JOIN alldays d
WHERE NOT EXISTS
(
SELECT userid, dates
FROM mydata md
WHERE md.userid = u.userid AND md.dates = d.currdate
)
ORDER BY u.userid, d.currdate;
dbfiddle[
^]
Note:
Above query returns all missing dates till now + 30 days. Change it to your needs.