Refactor: simplify user authentication flow
- Replaced manual token validation with built-in middleware - Removed redundant session checks in controllers
This commit is contained in:
+44
-26
@@ -32,7 +32,7 @@
|
||||
|
||||
use std::io::{self, Write};
|
||||
|
||||
use obikseq::superkmer::SuperKmer;
|
||||
use obikseq::{kmer::Kmer, superkmer::SuperKmer};
|
||||
use xxhash_rust::xxh64::xxh64;
|
||||
|
||||
// ── public API ────────────────────────────────────────────────────────────────
|
||||
@@ -54,13 +54,13 @@ pub fn write_scatter<W: Write>(
|
||||
out: &mut W,
|
||||
k: usize,
|
||||
m: usize,
|
||||
partition: u32,
|
||||
min_hash: u64,
|
||||
partition: usize,
|
||||
minimizer: Kmer,
|
||||
) -> io::Result<()> {
|
||||
let ascii = sk.to_ascii();
|
||||
let id = seq_id(&ascii);
|
||||
let seq_len = ascii.len();
|
||||
let min_seq = decode_mmer(min_hash, m);
|
||||
let min_seq = minimizer.to_ascii(m);
|
||||
|
||||
writeln!(
|
||||
out,
|
||||
@@ -72,18 +72,12 @@ pub fn write_scatter<W: Write>(
|
||||
k = k,
|
||||
m = m,
|
||||
partition = partition,
|
||||
min = std::str::from_utf8(&min_seq).unwrap(),
|
||||
min = unsafe { std::str::from_utf8_unchecked(&min_seq) },
|
||||
)?;
|
||||
out.write_all(&ascii)?;
|
||||
out.write_all(b"\n")
|
||||
}
|
||||
|
||||
/// Decode a right-aligned 2-bit minimizer value into uppercase ASCII (A/C/G/T).
|
||||
fn decode_mmer(val: u64, m: usize) -> Vec<u8> {
|
||||
const BASES: [u8; 4] = [b'A', b'C', b'G', b'T'];
|
||||
(0..m).map(|i| BASES[((val >> (2 * (m - 1 - i))) & 3) as usize]).collect()
|
||||
}
|
||||
|
||||
/// Write one super-kmer in FASTA format — **count phase**.
|
||||
///
|
||||
/// The `count` field in the JSON annotation contains the occurrence count from
|
||||
@@ -154,7 +148,7 @@ mod tests {
|
||||
fn scatter_header_contains_minimizer_field() {
|
||||
let mut sk = make(b"ACGTACGTACGT");
|
||||
sk.set_minimizer_pos(2);
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 3, 7, 0));
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 3, 7, Kmer::from_raw(0)));
|
||||
assert!(out.contains("\"minimizer\":\""));
|
||||
assert!(!out.contains("\"count\":"));
|
||||
}
|
||||
@@ -164,7 +158,7 @@ mod tests {
|
||||
// min_hash for "ACG" (A=0,C=1,G=2, m=3): 0*16 + 1*4 + 2 = 6
|
||||
let mut sk = make(b"ACGTACGTACGT");
|
||||
sk.set_minimizer_pos(0);
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 3, 0, 6));
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 3, 0, Kmer::from_raw_right(6, 3)));
|
||||
assert!(out.contains("\"minimizer\":\"ACG\""), "got: {out}");
|
||||
}
|
||||
|
||||
@@ -172,7 +166,7 @@ mod tests {
|
||||
fn scatter_fields_present() {
|
||||
let mut sk = make(b"ACGTACGTACGT");
|
||||
sk.set_minimizer_pos(0);
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 3, 5, 0));
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 3, 5, Kmer::from_raw(0)));
|
||||
assert!(out.contains("\"seq_length\":12"));
|
||||
assert!(out.contains("\"kmer_size\":4"));
|
||||
assert!(out.contains("\"minimizer_size\":3"));
|
||||
@@ -183,7 +177,7 @@ mod tests {
|
||||
fn scatter_sequence_line_correct() {
|
||||
let mut sk = make(b"ACGTACGT");
|
||||
sk.set_minimizer_pos(0);
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 2, 0, 0));
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 2, 0, Kmer::from_raw(0)));
|
||||
let lines: Vec<&str> = out.lines().collect();
|
||||
assert_eq!(lines[1], "ACGTACGT");
|
||||
}
|
||||
@@ -228,12 +222,24 @@ mod tests {
|
||||
let mut sk1 = make(b"ACGTACGT");
|
||||
sk1.set_minimizer_pos(0);
|
||||
let mut sk2 = make(b"ACGTACGT");
|
||||
sk2.set_minimizer_pos(4); // different pos, same sequence
|
||||
sk2.set_minimizer_pos(4); // different pos, same sequence
|
||||
|
||||
let id1 = capture(|w| write_scatter(&sk1, w, 4, 2, 0, 0))
|
||||
.lines().next().unwrap().split_whitespace().next().unwrap()[1..].to_string();
|
||||
let id2 = capture(|w| write_scatter(&sk2, w, 4, 2, 0, 0))
|
||||
.lines().next().unwrap().split_whitespace().next().unwrap()[1..].to_string();
|
||||
let id1 = capture(|w| write_scatter(&sk1, w, 4, 2, 0, Kmer::from_raw(0)))
|
||||
.lines()
|
||||
.next()
|
||||
.unwrap()
|
||||
.split_whitespace()
|
||||
.next()
|
||||
.unwrap()[1..]
|
||||
.to_string();
|
||||
let id2 = capture(|w| write_scatter(&sk2, w, 4, 2, 0, Kmer::from_raw(0)))
|
||||
.lines()
|
||||
.next()
|
||||
.unwrap()
|
||||
.split_whitespace()
|
||||
.next()
|
||||
.unwrap()[1..]
|
||||
.to_string();
|
||||
assert_eq!(id1, id2, "same sequence must produce same ID");
|
||||
}
|
||||
|
||||
@@ -244,10 +250,22 @@ mod tests {
|
||||
let mut sk2 = make(b"TTTTTTTT");
|
||||
sk2.set_minimizer_pos(0);
|
||||
|
||||
let id1 = capture(|w| write_scatter(&sk1, w, 4, 2, 0, 0))
|
||||
.lines().next().unwrap().split_whitespace().next().unwrap()[1..].to_string();
|
||||
let id2 = capture(|w| write_scatter(&sk2, w, 4, 2, 0, 0))
|
||||
.lines().next().unwrap().split_whitespace().next().unwrap()[1..].to_string();
|
||||
let id1 = capture(|w| write_scatter(&sk1, w, 4, 2, 0, Kmer::from_raw(0)))
|
||||
.lines()
|
||||
.next()
|
||||
.unwrap()
|
||||
.split_whitespace()
|
||||
.next()
|
||||
.unwrap()[1..]
|
||||
.to_string();
|
||||
let id2 = capture(|w| write_scatter(&sk2, w, 4, 2, 0, Kmer::from_raw(0)))
|
||||
.lines()
|
||||
.next()
|
||||
.unwrap()
|
||||
.split_whitespace()
|
||||
.next()
|
||||
.unwrap()[1..]
|
||||
.to_string();
|
||||
assert_ne!(id1, id2);
|
||||
}
|
||||
|
||||
@@ -255,8 +273,8 @@ mod tests {
|
||||
fn id_is_16_hex_digits() {
|
||||
let mut sk = make(b"ACGTACGT");
|
||||
sk.set_minimizer_pos(0);
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 2, 0, 0));
|
||||
let id = &out.lines().next().unwrap()[1..17]; // skip '>'
|
||||
let out = capture(|w| write_scatter(&sk, w, 4, 2, 0, Kmer::from_raw(0)));
|
||||
let id = &out.lines().next().unwrap()[1..17]; // skip '>'
|
||||
assert_eq!(id.len(), 16);
|
||||
assert!(id.chars().all(|c| c.is_ascii_hexdigit()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user