From bf7558830f6bd711d259f6641c52e8395bbab437 Mon Sep 17 00:00:00 2001
From: Dessalines <tyhou13@gmx.com>
Date: Thu, 1 Apr 2021 13:57:45 -0400
Subject: [PATCH] Changing preferred to display name. Fixes #1211

---
 api_tests/package.json                           |  2 +-
 api_tests/src/user.spec.ts                       |  4 ++--
 api_tests/yarn.lock                              |  8 ++++----
 crates/api/src/local_user.rs                     | 10 +++++-----
 crates/api_common/src/person.rs                  |  2 +-
 crates/apub/src/objects/person.rs                |  9 +++++----
 crates/db_queries/src/source/person.rs           | 16 ++++++++--------
 crates/db_schema/src/schema.rs                   |  6 +++---
 crates/db_schema/src/source/person.rs            | 14 +++++++-------
 crates/db_views/src/comment_view.rs              |  2 +-
 crates/db_views/src/post_view.rs                 |  2 +-
 crates/utils/src/test.rs                         |  8 ++++----
 crates/utils/src/utils.rs                        |  6 ++----
 .../down.sql                                     |  6 ++++++
 .../up.sql                                       |  6 ++++++
 15 files changed, 56 insertions(+), 45 deletions(-)
 create mode 100644 migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql
 create mode 100644 migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql

diff --git a/api_tests/package.json b/api_tests/package.json
index 7cb94959..1b0583c4 100644
--- a/api_tests/package.json
+++ b/api_tests/package.json
@@ -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",
diff --git a/api_tests/src/user.spec.ts b/api_tests/src/user.spec.ts
index a10876cf..5d10fd04 100644
--- a/api_tests/src/user.spec.ts
+++ b/api_tests/src/user.spec.ts
@@ -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,
diff --git a/api_tests/yarn.lock b/api_tests/yarn.lock
index 8f8abf87..f3b8e603 100644
--- a/api_tests/yarn.lock
+++ b/api_tests/yarn.lock
@@ -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"
diff --git a/crates/api/src/local_user.rs b/crates/api/src/local_user.rs
index 656ddf97..2fb4056f 100644
--- a/crates/api/src/local_user.rs
+++ b/crates/api/src/local_user.rs
@@ -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,
@@ -174,7 +174,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 {
@@ -183,8 +183,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());
       }
     }
@@ -235,7 +235,7 @@ impl Perform for SaveUserSettings {
       avatar,
       banner,
       inbox_url: None,
-      preferred_username,
+      display_name,
       published: None,
       updated: Some(naive_now()),
       banned: None,
diff --git a/crates/api_common/src/person.rs b/crates/api_common/src/person.rs
index 7767da46..d95fed6b 100644
--- a/crates/api_common/src/person.rs
+++ b/crates/api_common/src/person.rs
@@ -53,7 +53,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>,
diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs
index 25c785d8..3e468d5c 100644
--- a/crates/apub/src/objects/person.rs
+++ b/crates/apub/src/objects/person.rs
@@ -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())),
diff --git a/crates/db_queries/src/source/person.rs b/crates/db_queries/src/source/person.rs
index 35ed540c..2d332bd0 100644
--- a/crates/db_queries/src/source/person.rs
+++ b/crates/db_queries/src/source/person.rs
@@ -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,
diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs
index 5bc55f52..04b5322c 100644
--- a/crates/db_schema/src/schema.rs
+++ b/crates/db_schema/src/schema.rs
@@ -270,7 +270,7 @@ table! {
     person (id) {
         id -> Int4,
         name -> Varchar,
-        preferred_username -> Nullable<Varchar>,
+        display_name -> Nullable<Varchar>,
         avatar -> Nullable<Varchar>,
         banned -> Bool,
         published -> Timestamp,
@@ -470,7 +470,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,
@@ -494,7 +494,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,
diff --git a/crates/db_schema/src/source/person.rs b/crates/db_schema/src/source/person.rs
index 2c0e7e8b..be1ce268 100644
--- a/crates/db_schema/src/source/person.rs
+++ b/crates/db_schema/src/source/person.rs
@@ -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>,
diff --git a/crates/db_views/src/comment_view.rs b/crates/db_views/src/comment_view.rs
index 6b13103c..ff5b6deb 100644
--- a/crates/db_views/src/comment_view.rs
+++ b/crates/db_views/src/comment_view.rs
@@ -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(),
diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs
index df67d369..64f261aa 100644
--- a/crates/db_views/src/post_view.rs
+++ b/crates/db_views/src/post_view.rs
@@ -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(),
diff --git a/crates/utils/src/test.rs b/crates/utils/src/test.rs
index aaa59bfa..04abd4b7 100644
--- a/crates/utils/src/test.rs
+++ b/crates/utils/src/test.rs
@@ -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,9 @@ 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"));
 }
 
 #[test]
diff --git a/crates/utils/src/utils.rs b/crates/utils/src/utils.rs
index c53d6c7c..931565b6 100644
--- a/crates/utils/src/utils.rs
+++ b/crates/utils/src/utils.rs
@@ -108,10 +108,8 @@ 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.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
index 00000000..844c02d3
--- /dev/null
+++ b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql
@@ -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
index 00000000..f4b9729c
--- /dev/null
+++ b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql
@@ -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;
-- 
2.44.1