Skip to content

Commit f651806

Browse files
committed
claimed uid region support
1 parent 45e01aa commit f651806

3 files changed

Lines changed: 45 additions & 7 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
ALTER TABLE ntehelper_tracker_uid_claim
2+
ADD COLUMN region text NOT NULL DEFAULT 'europe';
3+
4+
ALTER TABLE ntehelper_tracker_uid_claim
5+
ADD CONSTRAINT ntehelper_tracker_uid_claim_region_check
6+
CHECK (region IN ('asia', 'europe', 'america', 'china'));

src/api/ntehelper/tracker.rs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ struct TrackerClaimsResponse {
8080
struct TrackerUidClaimResponse {
8181
uid: String,
8282
nickname: String,
83+
region: String,
8384
owner_username: Option<String>,
8485
claim_source: String,
8586
has_profile: bool,
@@ -90,7 +91,8 @@ struct TrackerUidClaimResponse {
9091
#[derive(Deserialize, ToSchema)]
9192
#[serde(rename_all = "camelCase")]
9293
struct TrackerClaimUpdateRequest {
93-
nickname: String,
94+
nickname: Option<String>,
95+
region: Option<String>,
9496
}
9597

9698
#[derive(Serialize, ToSchema)]
@@ -285,15 +287,30 @@ async fn put_tracker_uid_claim(
285287
let Some(uid) = validate_tracker_uid(&uid) else {
286288
return Ok(HttpResponse::BadRequest().body("Invalid tracker UID"));
287289
};
288-
let Some(nickname) = validate_tracker_nickname(&body.nickname) else {
289-
return Ok(HttpResponse::BadRequest().body("Invalid tracker nickname"));
290+
let nickname = match body.nickname.as_deref() {
291+
Some(value) => match validate_tracker_nickname(value) {
292+
Some(value) => Some(value),
293+
None => return Ok(HttpResponse::BadRequest().body("Invalid tracker nickname")),
294+
},
295+
None => None,
290296
};
297+
let region = match body.region.as_deref() {
298+
Some(value) => match validate_tracker_region(value) {
299+
Some(value) => Some(value),
300+
None => return Ok(HttpResponse::BadRequest().body("Invalid tracker region")),
301+
},
302+
None => None,
303+
};
304+
if nickname.is_none() && region.is_none() {
305+
return Ok(HttpResponse::BadRequest().body("Tracker claim update is empty"));
306+
}
291307

292308
let user_id = database::ntehelper_tracker::get_tracker_user_id(&username, &pool).await?;
293-
let claim = match database::ntehelper_tracker::update_tracker_claim_nickname(
309+
let claim = match database::ntehelper_tracker::update_tracker_claim(
294310
user_id,
295311
uid,
296312
nickname,
313+
region,
297314
&pool,
298315
)
299316
.await?
@@ -554,6 +571,13 @@ fn validate_tracker_uid(value: &str) -> Option<i64> {
554571
trimmed.parse::<i64>().ok()
555572
}
556573

574+
fn validate_tracker_region(value: &str) -> Option<&str> {
575+
match value.trim() {
576+
"asia" | "europe" | "america" | "china" => Some(value.trim()),
577+
_ => None,
578+
}
579+
}
580+
557581
fn validate_tracker_nickname(value: &str) -> Option<&str> {
558582
let trimmed = value.trim();
559583
if trimmed.chars().count() > TRACKER_NICKNAME_MAX_CHARS {
@@ -817,6 +841,7 @@ impl From<database::ntehelper_tracker::DbTrackerUidClaim> for TrackerUidClaimRes
817841
TrackerUidClaimResponse {
818842
uid: claim.uid.to_string(),
819843
nickname: claim.nickname,
844+
region: claim.region,
820845
owner_username: claim.owner_username,
821846
claim_source: claim.claim_source,
822847
has_profile: claim.has_profile,

src/database/ntehelper_tracker.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use std::{
1010
pub struct DbTrackerUidClaim {
1111
pub uid: i64,
1212
pub nickname: String,
13+
pub region: String,
1314
pub owner_user_id: Option<i64>,
1415
pub owner_username: Option<String>,
1516
pub claim_source: String,
@@ -81,6 +82,7 @@ pub async fn tracker_claims_for_user(
8182
r#"SELECT
8283
c.uid,
8384
c.nickname,
85+
c.region,
8486
c.owner_user_id,
8587
u.username AS owner_username,
8688
c.claim_source,
@@ -102,6 +104,7 @@ pub async fn get_tracker_claim(uid: i64, pool: &PgPool) -> Result<Option<DbTrack
102104
r#"SELECT
103105
c.uid,
104106
c.nickname,
107+
c.region,
105108
c.owner_user_id,
106109
u.username AS owner_username,
107110
c.claim_source,
@@ -208,20 +211,24 @@ pub async fn claim_tracker_uid(
208211
.expect("created tracker claim should load")))
209212
}
210213

211-
pub async fn update_tracker_claim_nickname(
214+
pub async fn update_tracker_claim(
212215
owner_user_id: i64,
213216
uid: i64,
214-
nickname: &str,
217+
nickname: Option<&str>,
218+
region: Option<&str>,
215219
pool: &PgPool,
216220
) -> Result<std::result::Result<DbTrackerUidClaim, TrackerClaimError>> {
217221
let result = sqlx::query(
218222
"UPDATE ntehelper_tracker_uid_claim
219-
SET nickname = $3, updated_at = now()
223+
SET nickname = COALESCE($3, nickname),
224+
region = COALESCE($4, region),
225+
updated_at = now()
220226
WHERE uid = $1 AND owner_user_id = $2",
221227
)
222228
.bind(uid)
223229
.bind(owner_user_id)
224230
.bind(nickname)
231+
.bind(region)
225232
.execute(pool)
226233
.await?;
227234

0 commit comments

Comments
 (0)