]> Untitled Git - lemmy.git/commitdiff
Merge pull request #1536 from LemmyNet/change_preferred_to_display_name
authorNutomic <me@nutomic.com>
Tue, 6 Apr 2021 12:02:50 +0000 (12:02 +0000)
committerGitHub <noreply@github.com>
Tue, 6 Apr 2021 12:02:50 +0000 (12:02 +0000)
Changing preferred to display name. Fixes #1211

15 files changed:
api_tests/package.json
api_tests/src/user.spec.ts
api_tests/yarn.lock
crates/api/src/local_user.rs
crates/api_common/src/person.rs
crates/apub/src/objects/person.rs
crates/db_queries/src/source/person.rs
crates/db_schema/src/schema.rs
crates/db_schema/src/source/person.rs
crates/db_views/src/comment_view.rs
crates/db_views/src/post_view.rs
crates/utils/src/test.rs
crates/utils/src/utils.rs
migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql [new file with mode: 0644]
migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql [new file with mode: 0644]

index 7cb949594f859be7e72f96395926ab5e2a7780bf..1b0583c4f5537da9a2fec638dcc12c67a8da7876 100644 (file)
@@ -16,7 +16,7 @@
     "eslint": "^7.18.0",
     "eslint-plugin-jane": "^9.0.3",
     "jest": "^26.6.3",
-    "lemmy-js-client": "0.10.0-rc.13",
+    "lemmy-js-client": "0.11.0-rc.1",
     "node-fetch": "^2.6.1",
     "prettier": "^2.1.2",
     "ts-jest": "^26.4.4",
index a10876cf5e435ad346b2dd45390a14b931189244..5d10fd04382d59b71f4154befd5505f117626c4e 100644 (file)
@@ -19,7 +19,7 @@ let apShortname: string;
 
 function assertUserFederation(userOne: PersonViewSafe, userTwo: PersonViewSafe) {
   expect(userOne.person.name).toBe(userTwo.person.name);
-  expect(userOne.person.preferred_username).toBe(userTwo.person.preferred_username);
+  expect(userOne.person.display_name).toBe(userTwo.person.display_name);
   expect(userOne.person.bio).toBe(userTwo.person.bio);
   expect(userOne.person.actor_id).toBe(userTwo.person.actor_id);
   expect(userOne.person.avatar).toBe(userTwo.person.avatar);
@@ -49,7 +49,7 @@ test('Set some user settings, check that they are federated', async () => {
     lang: '',
     avatar,
     banner,
-    preferred_username: 'user321',
+    display_name: 'user321',
     show_avatars: false,
     send_notifications_to_email: false,
     bio,
index 8f8abf87346e519c5616735044c0d2a2b4faa376..f3b8e603f9e8eda335a0b685e00c511b87a58676 100644 (file)
@@ -3233,10 +3233,10 @@ language-tags@^1.0.5:
   dependencies:
     language-subtag-registry "~0.3.2"
 
-lemmy-js-client@0.10.0-rc.13:
-  version "0.10.0-rc.13"
-  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.10.0-rc.13.tgz#ea2e88857243374d7fbd49ee6b4bb94c34359d85"
-  integrity sha512-zodvYkwBYR7iP27ah6L/QPUphUUdq38kCH7QF2CUYBrsSAEkGmq2kdz+iusnQ1Ht7Ad80GtYycFprsZBveV5eQ==
+lemmy-js-client@0.11.0-rc.1:
+  version "0.11.0-rc.1"
+  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.11.0-rc.1.tgz#0031676be9fc787157a21dd3f5095dd1ee9e6a57"
+  integrity sha512-dtpxe/hHTbYEv2WnfGkAieOB9jyKUVED+y4DosUp/FcaatjPcMTiKOvCdMNjlvvG/9GyclWEoyNitPEsvJwjmg==
 
 leven@^3.1.0:
   version "3.1.0"
index 8f69ab1b07f3135ee6cadeaed9f4daa94c7a38ed..6a319dcd5741494ac1bf4ad5e036ed82a34003e7 100644 (file)
@@ -60,7 +60,7 @@ use lemmy_utils::{
   email::send_email,
   location_info,
   settings::structs::Settings,
-  utils::{generate_random_string, is_valid_preferred_username, naive_from_unix},
+  utils::{generate_random_string, is_valid_display_name, naive_from_unix},
   ApiError,
   ConnectionId,
   LemmyError,
@@ -172,7 +172,7 @@ impl Perform for SaveUserSettings {
     let banner = diesel_option_overwrite_to_url(&data.banner)?;
     let email = diesel_option_overwrite(&data.email);
     let bio = diesel_option_overwrite(&data.bio);
-    let preferred_username = diesel_option_overwrite(&data.preferred_username);
+    let display_name = diesel_option_overwrite(&data.display_name);
     let matrix_user_id = diesel_option_overwrite(&data.matrix_user_id);
 
     if let Some(Some(bio)) = &bio {
@@ -181,8 +181,8 @@ impl Perform for SaveUserSettings {
       }
     }
 
-    if let Some(Some(preferred_username)) = &preferred_username {
-      if !is_valid_preferred_username(preferred_username.trim()) {
+    if let Some(Some(display_name)) = &display_name {
+      if !is_valid_display_name(display_name.trim()) {
         return Err(ApiError::err("invalid_username").into());
       }
     }
@@ -233,7 +233,7 @@ impl Perform for SaveUserSettings {
       avatar,
       banner,
       inbox_url: None,
-      preferred_username,
+      display_name,
       published: None,
       updated: Some(naive_now()),
       banned: None,
index bcbfa7292778aebe3c50c8ec1824e8a955aaae56..21fa1c778e5fe0393c6ef57368cd436e77ff055a 100644 (file)
@@ -55,7 +55,7 @@ pub struct SaveUserSettings {
   pub lang: Option<String>,
   pub avatar: Option<String>,
   pub banner: Option<String>,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub email: Option<String>,
   pub bio: Option<String>,
   pub matrix_user_id: Option<String>,
index 25c785d84b464a3051ba64b1681214135ea3ddeb..3e468d5c81bc7991b78b8013114f262a057f2d53 100644 (file)
@@ -64,7 +64,8 @@ impl ToApub for DbPerson {
       set_content_and_source(&mut person, bio)?;
     }
 
-    if let Some(i) = self.preferred_username.to_owned() {
+    // In apub, the "name" is a display name
+    if let Some(i) = self.display_name.to_owned() {
       person.set_name(i);
     }
 
@@ -161,7 +162,7 @@ impl FromApubToForm<PersonExt> for PersonForm {
       .preferred_username()
       .context(location_info!())?
       .to_string();
-    let preferred_username: Option<String> = person
+    let display_name: Option<String> = person
       .name()
       .map(|n| n.one())
       .flatten()
@@ -176,12 +177,12 @@ impl FromApubToForm<PersonExt> for PersonForm {
       .map(|s| s.to_owned().into());
 
     check_slurs(&name)?;
-    check_slurs_opt(&preferred_username)?;
+    check_slurs_opt(&display_name)?;
     check_slurs_opt(&bio)?;
 
     Ok(PersonForm {
       name,
-      preferred_username: Some(preferred_username),
+      display_name: Some(display_name),
       banned: None,
       deleted: None,
       avatar: avatar.map(|o| o.map(|i| i.into())),
index 35ed540c0fc4f51846cbc8f3d5937707c5d5df93..2d332bd01eccd5d866283263ccb59ff66157603c 100644 (file)
@@ -15,7 +15,7 @@ mod safe_type {
   type Columns = (
     id,
     name,
-    preferred_username,
+    display_name,
     avatar,
     banned,
     published,
@@ -37,7 +37,7 @@ mod safe_type {
       (
         id,
         name,
-        preferred_username,
+        display_name,
         avatar,
         banned,
         published,
@@ -63,7 +63,7 @@ mod safe_type_alias_1 {
   type Columns = (
     id,
     name,
-    preferred_username,
+    display_name,
     avatar,
     banned,
     published,
@@ -85,7 +85,7 @@ mod safe_type_alias_1 {
       (
         id,
         name,
-        preferred_username,
+        display_name,
         avatar,
         banned,
         published,
@@ -111,7 +111,7 @@ mod safe_type_alias_2 {
   type Columns = (
     id,
     name,
-    preferred_username,
+    display_name,
     avatar,
     banned,
     published,
@@ -133,7 +133,7 @@ mod safe_type_alias_2 {
       (
         id,
         name,
-        preferred_username,
+        display_name,
         avatar,
         banned,
         published,
@@ -236,7 +236,7 @@ impl Person_ for Person {
 
     diesel::update(person.find(person_id))
       .set((
-        preferred_username.eq::<Option<String>>(None),
+        display_name.eq::<Option<String>>(None),
         bio.eq::<Option<String>>(None),
         matrix_user_id.eq::<Option<String>>(None),
         deleted.eq(true),
@@ -264,7 +264,7 @@ mod tests {
     let expected_person = Person {
       id: inserted_person.id,
       name: "holly".into(),
-      preferred_username: None,
+      display_name: None,
       avatar: None,
       banner: None,
       banned: false,
index a99908ad3ed8a98505af81b593f6562fb3c3a34a..32fd3de1889d74cf066267c718f5a42ccdf39109 100644 (file)
@@ -271,7 +271,7 @@ table! {
     person (id) {
         id -> Int4,
         name -> Varchar,
-        preferred_username -> Nullable<Varchar>,
+        display_name -> Nullable<Varchar>,
         avatar -> Nullable<Varchar>,
         banned -> Bool,
         published -> Timestamp,
@@ -471,7 +471,7 @@ table! {
     person_alias_1 (id) {
         id -> Int4,
         name -> Varchar,
-        preferred_username -> Nullable<Varchar>,
+        display_name -> Nullable<Varchar>,
         avatar -> Nullable<Varchar>,
         banned -> Bool,
         published -> Timestamp,
@@ -495,7 +495,7 @@ table! {
     person_alias_2 (id) {
         id -> Int4,
         name -> Varchar,
-        preferred_username -> Nullable<Varchar>,
+        display_name -> Nullable<Varchar>,
         avatar -> Nullable<Varchar>,
         banned -> Bool,
         published -> Timestamp,
index 2c0e7e8b790238b7c5a6c4b9fa6c45576b44da24..be1ce268f7d5bc4f4bc525ca4851cb2c1850b480 100644 (file)
@@ -10,7 +10,7 @@ use serde::Serialize;
 pub struct Person {
   pub id: PersonId,
   pub name: String,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub avatar: Option<DbUrl>,
   pub banned: bool,
   pub published: chrono::NaiveDateTime,
@@ -35,7 +35,7 @@ pub struct Person {
 pub struct PersonSafe {
   pub id: PersonId,
   pub name: String,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub avatar: Option<DbUrl>,
   pub banned: bool,
   pub published: chrono::NaiveDateTime,
@@ -56,7 +56,7 @@ pub struct PersonSafe {
 pub struct PersonAlias1 {
   pub id: PersonId,
   pub name: String,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub avatar: Option<DbUrl>,
   pub banned: bool,
   pub published: chrono::NaiveDateTime,
@@ -80,7 +80,7 @@ pub struct PersonAlias1 {
 pub struct PersonSafeAlias1 {
   pub id: PersonId,
   pub name: String,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub avatar: Option<DbUrl>,
   pub banned: bool,
   pub published: chrono::NaiveDateTime,
@@ -101,7 +101,7 @@ pub struct PersonSafeAlias1 {
 pub struct PersonAlias2 {
   pub id: PersonId,
   pub name: String,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub avatar: Option<DbUrl>,
   pub banned: bool,
   pub published: chrono::NaiveDateTime,
@@ -125,7 +125,7 @@ pub struct PersonAlias2 {
 pub struct PersonSafeAlias2 {
   pub id: PersonId,
   pub name: String,
-  pub preferred_username: Option<String>,
+  pub display_name: Option<String>,
   pub avatar: Option<DbUrl>,
   pub banned: bool,
   pub published: chrono::NaiveDateTime,
@@ -145,7 +145,7 @@ pub struct PersonSafeAlias2 {
 #[table_name = "person"]
 pub struct PersonForm {
   pub name: String,
-  pub preferred_username: Option<Option<String>>,
+  pub display_name: Option<Option<String>>,
   pub avatar: Option<Option<DbUrl>>,
   pub banned: Option<bool>,
   pub published: Option<chrono::NaiveDateTime>,
index 6b13103c0eb19b06f7db3c165b6ac389fcedcecc..ff5b6debfc4515f4d744b2a93d353a6b38b307bc 100644 (file)
@@ -519,7 +519,7 @@ mod tests {
       creator: PersonSafe {
         id: inserted_person.id,
         name: "timmy".into(),
-        preferred_username: None,
+        display_name: None,
         published: inserted_person.published,
         avatar: None,
         actor_id: inserted_person.actor_id.to_owned(),
index df67d36933376becf7cfad72d85b9dc77887898f..64f261aadbb0ac94f53562362d0a696630d6daca 100644 (file)
@@ -541,7 +541,7 @@ mod tests {
       creator: PersonSafe {
         id: inserted_person.id,
         name: person_name,
-        preferred_username: None,
+        display_name: None,
         published: inserted_person.published,
         avatar: None,
         actor_id: inserted_person.actor_id.to_owned(),
index aaa59bfa7aefcc6b0a0b229184e01080eb9b1541..754aa8c3a8befda82b79dcbc424979233c274821 100644 (file)
@@ -1,7 +1,7 @@
 use crate::utils::{
   is_valid_community_name,
+  is_valid_display_name,
   is_valid_post_title,
-  is_valid_preferred_username,
   is_valid_username,
   remove_slurs,
   scrape_text_for_mentions,
@@ -29,9 +29,15 @@ fn test_valid_register_username() {
 }
 
 #[test]
-fn test_valid_preferred_username() {
-  assert!(is_valid_preferred_username("hello @there"));
-  assert!(!is_valid_preferred_username("@hello there"));
+fn test_valid_display_name() {
+  assert!(is_valid_display_name("hello @there"));
+  assert!(!is_valid_display_name("@hello there"));
+
+  // Make sure zero-space with an @ doesn't work
+  assert!(!is_valid_display_name(&format!(
+    "{}@my name is",
+    '\u{200b}'
+  )));
 }
 
 #[test]
index c53d6c7c2c8bfe894b0f82ea50fac09a3cde5698..732ac2c8d85c5104d811e6eaf3e773e9d190dd3b 100644 (file)
@@ -108,10 +108,11 @@ pub fn is_valid_username(name: &str) -> bool {
 }
 
 // Can't do a regex here, reverse lookarounds not supported
-pub fn is_valid_preferred_username(preferred_username: &str) -> bool {
-  !preferred_username.starts_with('@')
-    && preferred_username.chars().count() >= 3
-    && preferred_username.chars().count() <= 20
+pub fn is_valid_display_name(name: &str) -> bool {
+  !name.starts_with('@')
+    && !name.starts_with('\u{200b}')
+    && name.chars().count() >= 3
+    && name.chars().count() <= 20
 }
 
 pub fn is_valid_community_name(name: &str) -> bool {
diff --git a/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql
new file mode 100644 (file)
index 0000000..844c02d
--- /dev/null
@@ -0,0 +1,6 @@
+alter table person rename display_name to preferred_username;
+
+-- Regenerate the person_alias views
+drop view person_alias_1, person_alias_2;
+create view person_alias_1 as select * from person;
+create view person_alias_2 as select * from person;
diff --git a/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql
new file mode 100644 (file)
index 0000000..f4b9729
--- /dev/null
@@ -0,0 +1,6 @@
+alter table person rename preferred_username to display_name;
+
+-- Regenerate the person_alias views
+drop view person_alias_1, person_alias_2;
+create view person_alias_1 as select * from person;
+create view person_alias_2 as select * from person;