diff options
65 files changed, 2084 insertions, 345 deletions
@@ -153,24 +153,27 @@ If you'd like to add translations, take a look a look at the [English translatio - Languages supported: English (`en`), Chinese (`zh`), Dutch (`nl`), Esperanto (`eo`), French (`fr`), Spanish (`es`), Swedish (`sv`), German (`de`), Russian (`ru`), Italian (`it`). +<!-- translations --> + lang | done | missing --- | --- | --- -de | 94% | avatar,upload_avatar,show_avatars,docs,old_password,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,email_already_exists -eo | 81% | number_of_communities,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,docs,replies,mentions,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,are_you_sure,yes,no,email_already_exists -es | 89% | avatar,upload_avatar,show_avatars,archive_link,docs,replies,mentions,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,email_already_exists -fr | 89% | avatar,upload_avatar,show_avatars,archive_link,docs,replies,mentions,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,email_already_exists -it | 90% | avatar,upload_avatar,show_avatars,archive_link,docs,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,email_already_exists -nl | 100% | email_already_exists -ru | 77% | cross_posts,cross_post,number_of_communities,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,docs,replies,mentions,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,monero,by,to,transfer_community,transfer_site,are_you_sure,yes,no,email_already_exists -sv | 89% | avatar,upload_avatar,show_avatars,archive_link,docs,replies,mentions,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,email_already_exists -zh | 75% | cross_posts,cross_post,users,number_of_communities,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,docs,replies,mentions,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,monero,by,to,transfer_community,transfer_site,are_you_sure,yes,no,email_already_exists - +de | 88% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +eo | 76% | number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,donate_to_lemmy,donate,from,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +es | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +fr | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +it | 84% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +nl | 93% | create_private_message,send_secure_message,send_message,message,message_sent,messages,matrix_user_id,private_message_disclaimer,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +ru | 72% | cross_posts,cross_post,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +sv | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message +zh | 70% | cross_posts,cross_post,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message + +<!-- translationsstop --> If you'd like to update this report, run: ```bash cd ui -ts-node translation_report.ts > tmp # And replace the text above. +ts-node translation_report.ts ``` ## Credits diff --git a/docker/dev/deploy.sh b/docker/dev/deploy.sh index 8a709dcd..6b79f8f2 100755 --- a/docker/dev/deploy.sh +++ b/docker/dev/deploy.sh @@ -24,9 +24,6 @@ git add ../prod/docker-compose.yml # The commit git commit -m"Version $new_tag" -# Registering qemu binaries -docker run --rm --privileged multiarch/qemu-user-static:register --reset - # Rebuilding docker docker-compose build docker tag dev_lemmy:latest dessalines/lemmy:x64-$new_tag @@ -42,6 +39,9 @@ docker push dessalines/lemmy:x64-$new_tag # aarch64 # Only do this on major releases (IE the third semver is 0) if [ $third_semver -eq 0 ]; then + # Registering qemu binaries + docker run --rm --privileged multiarch/qemu-user-static:register --reset + docker build -t lemmy:aarch64 -f Dockerfile.aarch64 ../../ docker tag lemmy:aarch64 dessalines/lemmy:arm64-$new_tag docker push dessalines/lemmy:arm64-$new_tag diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index 29effb8f..67fbf936 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -11,7 +11,7 @@ services: - lemmy_db:/var/lib/postgresql/data restart: always lemmy: - image: dessalines/lemmy:v0.6.0 + image: dessalines/lemmy:v0.6.2 ports: - "127.0.0.1:8536:8536" restart: always diff --git a/server/migrations/2020-01-21-001001_create_private_message/down.sql b/server/migrations/2020-01-21-001001_create_private_message/down.sql new file mode 100644 index 00000000..0d951e3e --- /dev/null +++ b/server/migrations/2020-01-21-001001_create_private_message/down.sql @@ -0,0 +1,34 @@ +-- Drop the triggers +drop trigger refresh_private_message on private_message; +drop function refresh_private_message(); + +-- Drop the view and table +drop view private_message_view cascade; +drop table private_message; + +-- Rebuild the old views +drop view user_view cascade; +create view user_view as +select +u.id, +u.name, +u.avatar, +u.email, +u.fedi_name, +u.admin, +u.banned, +u.show_avatars, +u.send_notifications_to_email, +u.published, +(select count(*) from post p where p.creator_id = u.id) as number_of_posts, +(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, +(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, +(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score +from user_ u; + +create materialized view user_mview as select * from user_view; + +create unique index idx_user_mview_id on user_mview (id); + +-- Drop the columns +alter table user_ drop column matrix_user_id; diff --git a/server/migrations/2020-01-21-001001_create_private_message/up.sql b/server/migrations/2020-01-21-001001_create_private_message/up.sql new file mode 100644 index 00000000..48e16dd8 --- /dev/null +++ b/server/migrations/2020-01-21-001001_create_private_message/up.sql @@ -0,0 +1,90 @@ +-- Creating private message +create table private_message ( + id serial primary key, + creator_id int references user_ on update cascade on delete cascade not null, + recipient_id int references user_ on update cascade on delete cascade not null, + content text not null, + deleted boolean default false not null, + read boolean default false not null, + published timestamp not null default now(), + updated timestamp +); + +-- Create the view and materialized view which has the avatar and creator name +create view private_message_view as +select +pm.*, +u.name as creator_name, +u.avatar as creator_avatar, +u2.name as recipient_name, +u2.avatar as recipient_avatar +from private_message pm +inner join user_ u on u.id = pm.creator_id +inner join user_ u2 on u2.id = pm.recipient_id; + +create materialized view private_message_mview as select * from private_message_view; + +create unique index idx_private_message_mview_id on private_message_mview (id); + +-- Create the triggers +create or replace function refresh_private_message() +returns trigger language plpgsql +as $$ +begin + refresh materialized view concurrently private_message_mview; + return null; +end $$; + +create trigger refresh_private_message +after insert or update or delete or truncate +on private_message +for each statement +execute procedure refresh_private_message(); + +-- Update user to include matrix id +alter table user_ add column matrix_user_id text unique; + +drop view user_view cascade; +create view user_view as +select +u.id, +u.name, +u.avatar, +u.email, +u.matrix_user_id, +u.fedi_name, +u.admin, +u.banned, +u.show_avatars, +u.send_notifications_to_email, +u.published, +(select count(*) from post p where p.creator_id = u.id) as number_of_posts, +(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, +(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, +(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score +from user_ u; + +create materialized view user_mview as select * from user_view; + +create unique index idx_user_mview_id on user_mview (id); + +-- This is what a group pm table would look like +-- Not going to do it now because of the complications +-- +-- create table private_message ( +-- id serial primary key, +-- creator_id int references user_ on update cascade on delete cascade not null, +-- content text not null, +-- deleted boolean default false not null, +-- published timestamp not null default now(), +-- updated timestamp +-- ); +-- +-- create table private_message_recipient ( +-- id serial primary key, +-- private_message_id int references private_message on update cascade on delete cascade not null, +-- recipient_id int references user_ on update cascade on delete cascade not null, +-- read boolean default false not null, +-- published timestamp not null default now(), +-- unique(private_message_id, recipient_id) +-- ) diff --git a/server/src/api/comment.rs b/server/src/api/comment.rs index d26c2dce..8efb30fb 100644 --- a/server/src/api/comment.rs +++ b/server/src/api/comment.rs @@ -7,7 +7,7 @@ use diesel::PgConnection; pub struct CreateComment { content: String, parent_id: Option<i32>, - edit_id: Option<i32>, + edit_id: Option<i32>, // TODO this isn't used pub post_id: i32, auth: String, } @@ -15,7 +15,7 @@ pub struct CreateComment { #[derive(Serialize, Deserialize)] pub struct EditComment { content: String, - parent_id: Option<i32>, + parent_id: Option<i32>, // TODO why are the parent_id, creator_id, post_id, etc fields required? They aren't going to change edit_id: i32, creator_id: i32, pub post_id: i32, diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index bee7b8fe..cb09d7fa 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -8,6 +8,8 @@ use crate::db::moderator_views::*; use crate::db::password_reset_request::*; use crate::db::post::*; use crate::db::post_view::*; +use crate::db::private_message::*; +use crate::db::private_message_view::*; use crate::db::site::*; use crate::db::site_view::*; use crate::db::user::*; diff --git a/server/src/api/site.rs b/server/src/api/site.rs index 1291891b..a5faf34d 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -18,6 +18,7 @@ pub struct Search { sort: String, page: Option<i64>, limit: Option<i64>, + auth: Option<String>, } #[derive(Serialize, Deserialize)] @@ -297,6 +298,17 @@ impl Perform<SearchResponse> for Oper<Search> { fn perform(&self, conn: &PgConnection) -> Result<SearchResponse, Error> { let data: &Search = &self.data; + let user_id: Option<i32> = match &data.auth { + Some(auth) => match Claims::decode(&auth) { + Ok(claims) => { + let user_id = claims.claims.id; + Some(user_id) + } + Err(_e) => None, + }, + None => None, + }; + let sort = SortType::from_str(&data.sort)?; let type_ = SearchType::from_str(&data.type_)?; @@ -314,6 +326,7 @@ impl Perform<SearchResponse> for Oper<Search> { .show_nsfw(true) .for_community_id(data.community_id) .search_term(data.q.to_owned()) + .my_user_id(user_id) .page(data.page) .limit(data.limit) .list()?; @@ -322,6 +335,7 @@ impl Perform<SearchResponse> for Oper<Search> { comments = CommentQueryBuilder::create(&conn) .sort(&sort) .search_term(data.q.to_owned()) + .my_user_id(user_id) .page(data.page) .limit(data.limit) .list()?; @@ -348,6 +362,7 @@ impl Perform<SearchResponse> for Oper<Search> { .show_nsfw(true) .for_community_id(data.community_id) .search_term(data.q.to_owned()) + .my_user_id(user_id) .page(data.page) .limit(data.limit) .list()?; @@ -355,6 +370,7 @@ impl Perform<SearchResponse> for Oper<Search> { comments = CommentQueryBuilder::create(&conn) .sort(&sort) .search_term(data.q.to_owned()) + .my_user_id(user_id) .page(data.page) .limit(data.limit) .list()?; diff --git a/server/src/api/user.rs b/server/src/api/user.rs index e1ddb1ca..8d2db104 100644 --- a/server/src/api/user.rs +++ b/server/src/api/user.rs @@ -30,6 +30,7 @@ pub struct SaveUserSettings { lang: String, avatar: Option<String>, email: Option<String>, + matrix_user_id: Option<String>, new_password: Option<String>, new_password_verify: Option<String>, old_password: Option<String>, @@ -158,6 +159,40 @@ pub struct PasswordChange { password_verify: String, } +#[derive(Serialize, Deserialize)] +pub struct CreatePrivateMessage { + content: String, + recipient_id: i32, + auth: String, +} + +#[derive(Serialize, Deserialize)] +pub struct EditPrivateMessage { + edit_id: i32, + content: Option<String>, + deleted: Option<bool>, + read: Option<bool>, + auth: String, +} + +#[derive(Serialize, Deserialize)] +pub struct GetPrivateMessages { + unread_only: bool, + page: Option<i64>, + limit: Option<i64>, + auth: String, +} + +#[derive(Serialize, Deserialize, Clone)] +pub struct PrivateMessagesResponse { + messages: Vec<PrivateMessageView>, +} + +#[derive(Serialize, Deserialize, Clone)] +pub struct PrivateMessageResponse { + message: PrivateMessageView, +} + impl Perform<LoginResponse> for Oper<Login> { fn perform(&self, conn: &PgConnection) -> Result<LoginResponse, Error> { let data: &Login = &self.data; @@ -209,6 +244,7 @@ impl Perform<LoginResponse> for Oper<Register> { name: data.username.to_owned(), fedi_name: Settings::get().hostname.to_owned(), email: data.email.to_owned(), + matrix_user_id: None, avatar: None, password_encrypted: data.password.to_owned(), preferred_username: None, @@ -342,6 +378,7 @@ impl Perform<LoginResponse> for Oper<SaveUserSettings> { name: read_user.name, fedi_name: read_user.fedi_name, email, + matrix_user_id: data.matrix_user_id.to_owned(), avatar: data.avatar.to_owned(), passw |