mirror of
https://github.com/flibusta-apps/users_settings_server.git
synced 2026-03-02 22:55:22 +01:00
Add default_search to user_settings
Add migration to add a nullable VARCHAR(32) column with a CHECK constraint restricting values to book, author, series, translator. Update SQLx query artifacts, handlers, and serializers to read and write the new field.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "\n SELECT\n user_settings.id,\n user_settings.user_id,\n user_settings.last_name,\n user_settings.first_name,\n user_settings.username,\n user_settings.source,\n COALESCE(\n ARRAY_AGG(ROW(\n languages.id,\n languages.label,\n languages.code\n )::user_language_type) FILTER (WHERE languages.id IS NOT NULL),\n ARRAY[]::user_language_type[]\n ) AS \"allowed_langs!: Vec<UserLanguage>\"\n FROM user_settings\n LEFT JOIN users_languages ON user_settings.id = users_languages.user\n LEFT JOIN languages ON users_languages.language = languages.id\n WHERE user_settings.user_id = $1\n GROUP BY user_settings.id\n ",
|
"query": "\n SELECT\n user_settings.id,\n user_settings.user_id,\n user_settings.last_name,\n user_settings.first_name,\n user_settings.username,\n user_settings.source,\n user_settings.default_search,\n COALESCE(\n ARRAY_AGG(ROW(\n languages.id,\n languages.label,\n languages.code\n )::user_language_type) FILTER (WHERE languages.id IS NOT NULL),\n ARRAY[]::user_language_type[]\n ) AS \"allowed_langs!: Vec<UserLanguage>\"\n FROM user_settings\n LEFT JOIN users_languages ON user_settings.id = users_languages.user\n LEFT JOIN languages ON users_languages.language = languages.id\n WHERE user_settings.user_id = $1\n GROUP BY user_settings.id\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -35,6 +35,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ordinal": 6,
|
"ordinal": 6,
|
||||||
|
"name": "default_search",
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 7,
|
||||||
"name": "allowed_langs!: Vec<UserLanguage>",
|
"name": "allowed_langs!: Vec<UserLanguage>",
|
||||||
"type_info": {
|
"type_info": {
|
||||||
"Custom": {
|
"Custom": {
|
||||||
@@ -78,8 +83,9 @@
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
true,
|
||||||
null
|
null
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "f1ec22528fd84d652379dfe739d9ef7a7b5cad5609c5734c845bf0b6da0a5150"
|
"hash": "512725635fb38c268949661cf2bdc021837cd8b6fb5841c9644f268b89963b98"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "\n INSERT INTO user_settings (user_id, last_name, first_name, username, source)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (user_id) DO UPDATE\n SET last_name = $2, first_name = $3, username = $4, source = $5\n RETURNING id, user_id, last_name, first_name, username, source\n ",
|
"query": "\n INSERT INTO user_settings (user_id, last_name, first_name, username, source, default_search)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (user_id) DO UPDATE\n SET last_name = $2, first_name = $3, username = $4, source = $5, default_search = $6\n RETURNING id, user_id, last_name, first_name, username, source, default_search\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -32,6 +32,11 @@
|
|||||||
"ordinal": 5,
|
"ordinal": 5,
|
||||||
"name": "source",
|
"name": "source",
|
||||||
"type_info": "Varchar"
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 6,
|
||||||
|
"name": "default_search",
|
||||||
|
"type_info": "Varchar"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"parameters": {
|
"parameters": {
|
||||||
@@ -40,6 +45,7 @@
|
|||||||
"Varchar",
|
"Varchar",
|
||||||
"Varchar",
|
"Varchar",
|
||||||
"Varchar",
|
"Varchar",
|
||||||
|
"Varchar",
|
||||||
"Varchar"
|
"Varchar"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -49,8 +55,9 @@
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false
|
false,
|
||||||
|
true
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "51d29079e7c27eb0a59d309255e37fd595887cc3faf60a93533e9eadadcab1da"
|
"hash": "9ce4bb739dd3e8e8b0b8be165c13524eee4e07fae9a979022319ba106f17effd"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "\n SELECT\n user_settings.id,\n user_settings.user_id,\n user_settings.last_name,\n user_settings.first_name,\n user_settings.username,\n user_settings.source,\n COALESCE(\n ARRAY_AGG(ROW(\n languages.id,\n languages.label,\n languages.code\n )::user_language_type),\n ARRAY[]::user_language_type[]\n ) AS \"allowed_langs!: Vec<UserLanguage>\"\n FROM user_settings\n LEFT JOIN users_languages ON user_settings.id = users_languages.user\n LEFT JOIN languages ON users_languages.language = languages.id\n WHERE user_settings.id = $1\n GROUP BY user_settings.id\n ",
|
"query": "\n SELECT\n user_settings.id,\n user_settings.user_id,\n user_settings.last_name,\n user_settings.first_name,\n user_settings.username,\n user_settings.source,\n user_settings.default_search,\n COALESCE(\n ARRAY_AGG(ROW(\n languages.id,\n languages.label,\n languages.code\n )::user_language_type),\n ARRAY[]::user_language_type[]\n ) AS \"allowed_langs!: Vec<UserLanguage>\"\n FROM user_settings\n LEFT JOIN users_languages ON user_settings.id = users_languages.user\n LEFT JOIN languages ON users_languages.language = languages.id\n WHERE user_settings.id = $1\n GROUP BY user_settings.id\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -35,6 +35,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ordinal": 6,
|
"ordinal": 6,
|
||||||
|
"name": "default_search",
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 7,
|
||||||
"name": "allowed_langs!: Vec<UserLanguage>",
|
"name": "allowed_langs!: Vec<UserLanguage>",
|
||||||
"type_info": {
|
"type_info": {
|
||||||
"Custom": {
|
"Custom": {
|
||||||
@@ -78,8 +83,9 @@
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
true,
|
||||||
null
|
null
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "160ba7ba8bd514083af2a982dca1a0f1bc85e5b73d81a12b67d6c2b0d90e5740"
|
"hash": "b1f635ae66d1905c3b2b6dbb4fd9247cad8b941d5fe9090e27427915d172b4a6"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "\n SELECT\n user_settings.id,\n user_settings.user_id,\n user_settings.last_name,\n user_settings.first_name,\n user_settings.username,\n user_settings.source,\n COALESCE(\n ARRAY_AGG(ROW(\n languages.id,\n languages.label,\n languages.code\n )::user_language_type),\n ARRAY[]::user_language_type[]\n ) AS \"allowed_langs!: Vec<UserLanguage>\"\n FROM user_settings\n LEFT JOIN users_languages ON user_settings.id = users_languages.user\n LEFT JOIN languages ON users_languages.language = languages.id\n GROUP BY user_settings.id\n ORDER BY user_settings.id ASC\n OFFSET $1\n LIMIT $2\n ",
|
"query": "\n SELECT\n user_settings.id,\n user_settings.user_id,\n user_settings.last_name,\n user_settings.first_name,\n user_settings.username,\n user_settings.source,\n user_settings.default_search,\n COALESCE(\n ARRAY_AGG(ROW(\n languages.id,\n languages.label,\n languages.code\n )::user_language_type),\n ARRAY[]::user_language_type[]\n ) AS \"allowed_langs!: Vec<UserLanguage>\"\n FROM user_settings\n LEFT JOIN users_languages ON user_settings.id = users_languages.user\n LEFT JOIN languages ON users_languages.language = languages.id\n GROUP BY user_settings.id\n ORDER BY user_settings.id ASC\n OFFSET $1\n LIMIT $2\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -35,6 +35,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ordinal": 6,
|
"ordinal": 6,
|
||||||
|
"name": "default_search",
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 7,
|
||||||
"name": "allowed_langs!: Vec<UserLanguage>",
|
"name": "allowed_langs!: Vec<UserLanguage>",
|
||||||
"type_info": {
|
"type_info": {
|
||||||
"Custom": {
|
"Custom": {
|
||||||
@@ -79,8 +84,9 @@
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
true,
|
||||||
null
|
null
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "30aefca980d6708fa760e7cb4196224c1c597c70e57ec71e6deb4556385d355d"
|
"hash": "cca138dcdd45bec0bfe0341c851bcebf1f09256351ce80e4201ca0012427664d"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "\n SELECT id, user_id, last_name, first_name, username, source\n FROM user_settings\n WHERE user_id = $1\n ",
|
"query": "\n SELECT id, user_id, last_name, first_name, username, source, default_search\n FROM user_settings\n WHERE user_id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -32,6 +32,11 @@
|
|||||||
"ordinal": 5,
|
"ordinal": 5,
|
||||||
"name": "source",
|
"name": "source",
|
||||||
"type_info": "Varchar"
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 6,
|
||||||
|
"name": "default_search",
|
||||||
|
"type_info": "Varchar"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"parameters": {
|
"parameters": {
|
||||||
@@ -45,8 +50,9 @@
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false
|
false,
|
||||||
|
true
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "468d4e044e88a95969f77dc74c6e1c17907571e5119bf240e4facefef508b510"
|
"hash": "f208a1162fac1ff6ad8041c4408054d176bf9c967e6dd1a6e659c36a6cdb31f3"
|
||||||
}
|
}
|
||||||
4
migrations/20240101000006_add_default_search_setting.sql
Normal file
4
migrations/20240101000006_add_default_search_setting.sql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
-- Add default search setting: NULL = not selected, or one of: book, author, series, translator
|
||||||
|
ALTER TABLE user_settings
|
||||||
|
ADD COLUMN default_search VARCHAR(32) NULL
|
||||||
|
CHECK (default_search IS NULL OR default_search IN ('book', 'author', 'series', 'translator'));
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
pub mod serializers;
|
pub mod serializers;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
||||||
|
use self::{
|
||||||
|
serializers::{CreateOrUpdateUserData, SimpleUser, UserDetail, UserLanguage},
|
||||||
|
utils::update_languages,
|
||||||
|
};
|
||||||
use axum::{
|
use axum::{
|
||||||
extract::{Path, Query},
|
extract::{Path, Query},
|
||||||
http::StatusCode,
|
http::StatusCode,
|
||||||
@@ -8,12 +12,6 @@ use axum::{
|
|||||||
routing::{get, post},
|
routing::{get, post},
|
||||||
Json, Router,
|
Json, Router,
|
||||||
};
|
};
|
||||||
use serializers::SimpleUser;
|
|
||||||
|
|
||||||
use self::{
|
|
||||||
serializers::{CreateOrUpdateUserData, UserDetail, UserLanguage},
|
|
||||||
utils::update_languages,
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
pagination::{Page, Pagination},
|
pagination::{Page, Pagination},
|
||||||
@@ -38,6 +36,7 @@ async fn get_users(pagination: Query<Pagination>, db: Database) -> impl IntoResp
|
|||||||
user_settings.first_name,
|
user_settings.first_name,
|
||||||
user_settings.username,
|
user_settings.username,
|
||||||
user_settings.source,
|
user_settings.source,
|
||||||
|
user_settings.default_search,
|
||||||
COALESCE(
|
COALESCE(
|
||||||
ARRAY_AGG(ROW(
|
ARRAY_AGG(ROW(
|
||||||
languages.id,
|
languages.id,
|
||||||
@@ -75,6 +74,7 @@ async fn get_user(Path(user_id): Path<i64>, db: Database) -> impl IntoResponse {
|
|||||||
user_settings.first_name,
|
user_settings.first_name,
|
||||||
user_settings.username,
|
user_settings.username,
|
||||||
user_settings.source,
|
user_settings.source,
|
||||||
|
user_settings.default_search,
|
||||||
COALESCE(
|
COALESCE(
|
||||||
ARRAY_AGG(ROW(
|
ARRAY_AGG(ROW(
|
||||||
languages.id,
|
languages.id,
|
||||||
@@ -109,17 +109,18 @@ async fn create_or_update_user(
|
|||||||
let user = sqlx::query_as!(
|
let user = sqlx::query_as!(
|
||||||
SimpleUser,
|
SimpleUser,
|
||||||
r#"
|
r#"
|
||||||
INSERT INTO user_settings (user_id, last_name, first_name, username, source)
|
INSERT INTO user_settings (user_id, last_name, first_name, username, source, default_search)
|
||||||
VALUES ($1, $2, $3, $4, $5)
|
VALUES ($1, $2, $3, $4, $5, $6)
|
||||||
ON CONFLICT (user_id) DO UPDATE
|
ON CONFLICT (user_id) DO UPDATE
|
||||||
SET last_name = $2, first_name = $3, username = $4, source = $5
|
SET last_name = $2, first_name = $3, username = $4, source = $5, default_search = $6
|
||||||
RETURNING id, user_id, last_name, first_name, username, source
|
RETURNING id, user_id, last_name, first_name, username, source, default_search
|
||||||
"#,
|
"#,
|
||||||
data.user_id,
|
data.user_id,
|
||||||
data.last_name,
|
data.last_name,
|
||||||
data.first_name,
|
data.first_name,
|
||||||
data.username,
|
data.username,
|
||||||
data.source,
|
data.source,
|
||||||
|
data.default_search,
|
||||||
)
|
)
|
||||||
.fetch_one(&db.0)
|
.fetch_one(&db.0)
|
||||||
.await
|
.await
|
||||||
@@ -137,6 +138,7 @@ async fn create_or_update_user(
|
|||||||
user_settings.first_name,
|
user_settings.first_name,
|
||||||
user_settings.username,
|
user_settings.username,
|
||||||
user_settings.source,
|
user_settings.source,
|
||||||
|
user_settings.default_search,
|
||||||
COALESCE(
|
COALESCE(
|
||||||
ARRAY_AGG(ROW(
|
ARRAY_AGG(ROW(
|
||||||
languages.id,
|
languages.id,
|
||||||
@@ -164,7 +166,7 @@ async fn update_activity(Path(user_id): Path<i64>, db: Database) -> impl IntoRes
|
|||||||
let user = sqlx::query_as!(
|
let user = sqlx::query_as!(
|
||||||
SimpleUser,
|
SimpleUser,
|
||||||
r#"
|
r#"
|
||||||
SELECT id, user_id, last_name, first_name, username, source
|
SELECT id, user_id, last_name, first_name, username, source, default_search
|
||||||
FROM user_settings
|
FROM user_settings
|
||||||
WHERE user_id = $1
|
WHERE user_id = $1
|
||||||
"#,
|
"#,
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ pub struct SimpleUser {
|
|||||||
pub first_name: String,
|
pub first_name: String,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub source: String,
|
pub source: String,
|
||||||
|
pub default_search: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(sqlx::FromRow, Serialize)]
|
#[derive(sqlx::FromRow, Serialize)]
|
||||||
@@ -26,6 +27,7 @@ pub struct UserDetail {
|
|||||||
pub first_name: String,
|
pub first_name: String,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub source: String,
|
pub source: String,
|
||||||
|
pub default_search: Option<String>,
|
||||||
pub allowed_langs: Vec<UserLanguage>,
|
pub allowed_langs: Vec<UserLanguage>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,5 +38,6 @@ pub struct CreateOrUpdateUserData {
|
|||||||
pub first_name: String,
|
pub first_name: String,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub source: String,
|
pub source: String,
|
||||||
|
pub default_search: Option<String>,
|
||||||
pub allowed_langs: Vec<String>,
|
pub allowed_langs: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user