Highly ambitious ATProtocol AppView service and sdks

fix getActors query to query handles properly

+370 -2
+43
api/.sqlx/query-180c7eee2019dd4f04956a470aaf55064185639ac5a5d9f06cad38af68f122fa.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "\n SELECT did, handle, slice_uri, indexed_at\n FROM actor\n WHERE slice_uri = $1 AND handle = $2 AND did > $3\n ORDER BY did ASC\n LIMIT $4\n ", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "did", 9 + "type_info": "Text" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "handle", 14 + "type_info": "Text" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "slice_uri", 19 + "type_info": "Text" 20 + }, 21 + { 22 + "ordinal": 3, 23 + "name": "indexed_at", 24 + "type_info": "Text" 25 + } 26 + ], 27 + "parameters": { 28 + "Left": [ 29 + "Text", 30 + "Text", 31 + "Text", 32 + "Int8" 33 + ] 34 + }, 35 + "nullable": [ 36 + false, 37 + true, 38 + false, 39 + false 40 + ] 41 + }, 42 + "hash": "180c7eee2019dd4f04956a470aaf55064185639ac5a5d9f06cad38af68f122fa" 43 + }
+43
api/.sqlx/query-6b0bac4826d11b672583ccae3eb164239f2e17a2f8f13ec0c092557186e80d7e.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "\n SELECT did, handle, slice_uri, indexed_at\n FROM actor\n WHERE slice_uri = $1 AND handle ILIKE $2 AND did > $3\n ORDER BY did ASC\n LIMIT $4\n ", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "did", 9 + "type_info": "Text" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "handle", 14 + "type_info": "Text" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "slice_uri", 19 + "type_info": "Text" 20 + }, 21 + { 22 + "ordinal": 3, 23 + "name": "indexed_at", 24 + "type_info": "Text" 25 + } 26 + ], 27 + "parameters": { 28 + "Left": [ 29 + "Text", 30 + "Text", 31 + "Text", 32 + "Int8" 33 + ] 34 + }, 35 + "nullable": [ 36 + false, 37 + true, 38 + false, 39 + false 40 + ] 41 + }, 42 + "hash": "6b0bac4826d11b672583ccae3eb164239f2e17a2f8f13ec0c092557186e80d7e" 43 + }
+42
api/.sqlx/query-6fb1c37707b0004668ba441a1bb659b6cebe33800e57294e5a37478787af03bd.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "\n SELECT did, handle, slice_uri, indexed_at\n FROM actor\n WHERE slice_uri = $1 AND handle = $2\n ORDER BY did ASC\n LIMIT $3\n ", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "did", 9 + "type_info": "Text" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "handle", 14 + "type_info": "Text" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "slice_uri", 19 + "type_info": "Text" 20 + }, 21 + { 22 + "ordinal": 3, 23 + "name": "indexed_at", 24 + "type_info": "Text" 25 + } 26 + ], 27 + "parameters": { 28 + "Left": [ 29 + "Text", 30 + "Text", 31 + "Int8" 32 + ] 33 + }, 34 + "nullable": [ 35 + false, 36 + true, 37 + false, 38 + false 39 + ] 40 + }, 41 + "hash": "6fb1c37707b0004668ba441a1bb659b6cebe33800e57294e5a37478787af03bd" 42 + }
+42
api/.sqlx/query-d058bcd789a2e7c898c23d183704058bfded359222402771c2861b5ebf663369.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "\n SELECT did, handle, slice_uri, indexed_at\n FROM actor\n WHERE slice_uri = $1 AND did = $2\n ORDER BY did ASC\n LIMIT $3\n ", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "did", 9 + "type_info": "Text" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "handle", 14 + "type_info": "Text" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "slice_uri", 19 + "type_info": "Text" 20 + }, 21 + { 22 + "ordinal": 3, 23 + "name": "indexed_at", 24 + "type_info": "Text" 25 + } 26 + ], 27 + "parameters": { 28 + "Left": [ 29 + "Text", 30 + "Text", 31 + "Int8" 32 + ] 33 + }, 34 + "nullable": [ 35 + false, 36 + true, 37 + false, 38 + false 39 + ] 40 + }, 41 + "hash": "d058bcd789a2e7c898c23d183704058bfded359222402771c2861b5ebf663369" 42 + }
+42
api/.sqlx/query-d219e957aeb041e38abaec21b6c9da3124e2804f1ee745e57794ef5cb100757f.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "\n SELECT did, handle, slice_uri, indexed_at\n FROM actor\n WHERE slice_uri = $1 AND handle ILIKE $2\n ORDER BY did ASC\n LIMIT $3\n ", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "did", 9 + "type_info": "Text" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "handle", 14 + "type_info": "Text" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "slice_uri", 19 + "type_info": "Text" 20 + }, 21 + { 22 + "ordinal": 3, 23 + "name": "indexed_at", 24 + "type_info": "Text" 25 + } 26 + ], 27 + "parameters": { 28 + "Left": [ 29 + "Text", 30 + "Text", 31 + "Int8" 32 + ] 33 + }, 34 + "nullable": [ 35 + false, 36 + true, 37 + false, 38 + false 39 + ] 40 + }, 41 + "hash": "d219e957aeb041e38abaec21b6c9da3124e2804f1ee745e57794ef5cb100757f" 42 + }
+43
api/.sqlx/query-e80c5417fe3faffae69e8f93373b1a01c71cda8391c454edfbab881293210c9c.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "\n SELECT did, handle, slice_uri, indexed_at\n FROM actor\n WHERE slice_uri = $1 AND did = $2 AND did > $3\n ORDER BY did ASC\n LIMIT $4\n ", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "did", 9 + "type_info": "Text" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "handle", 14 + "type_info": "Text" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "slice_uri", 19 + "type_info": "Text" 20 + }, 21 + { 22 + "ordinal": 3, 23 + "name": "indexed_at", 24 + "type_info": "Text" 25 + } 26 + ], 27 + "parameters": { 28 + "Left": [ 29 + "Text", 30 + "Text", 31 + "Text", 32 + "Int8" 33 + ] 34 + }, 35 + "nullable": [ 36 + false, 37 + true, 38 + false, 39 + false 40 + ] 41 + }, 42 + "hash": "e80c5417fe3faffae69e8f93373b1a01c71cda8391c454edfbab881293210c9c" 43 + }
+115 -2
api/src/database.rs
··· 592 592 593 593 // Handle where conditions with specific cases 594 594 let records = if let Some(conditions) = where_conditions { 595 - // Handle specific common cases 596 - if let Some(did_condition) = conditions.get("did") { 595 + // Check for handle contains filter 596 + if let Some(handle_condition) = conditions.get("handle") { 597 + if let Some(contains_value) = &handle_condition.contains { 598 + let pattern = format!("%{}%", contains_value); 599 + if let Some(cursor_did) = cursor { 600 + sqlx::query_as!( 601 + Actor, 602 + r#" 603 + SELECT did, handle, slice_uri, indexed_at 604 + FROM actor 605 + WHERE slice_uri = $1 AND handle ILIKE $2 AND did > $3 606 + ORDER BY did ASC 607 + LIMIT $4 608 + "#, 609 + slice_uri, 610 + pattern, 611 + cursor_did, 612 + limit as i64 613 + ) 614 + .fetch_all(&self.pool) 615 + .await? 616 + } else { 617 + sqlx::query_as!( 618 + Actor, 619 + r#" 620 + SELECT did, handle, slice_uri, indexed_at 621 + FROM actor 622 + WHERE slice_uri = $1 AND handle ILIKE $2 623 + ORDER BY did ASC 624 + LIMIT $3 625 + "#, 626 + slice_uri, 627 + pattern, 628 + limit as i64 629 + ) 630 + .fetch_all(&self.pool) 631 + .await? 632 + } 633 + } else if let Some(eq_value) = &handle_condition.eq { 634 + let handle_str = eq_value.as_str().unwrap_or(""); 635 + if let Some(cursor_did) = cursor { 636 + sqlx::query_as!( 637 + Actor, 638 + r#" 639 + SELECT did, handle, slice_uri, indexed_at 640 + FROM actor 641 + WHERE slice_uri = $1 AND handle = $2 AND did > $3 642 + ORDER BY did ASC 643 + LIMIT $4 644 + "#, 645 + slice_uri, 646 + handle_str, 647 + cursor_did, 648 + limit as i64 649 + ) 650 + .fetch_all(&self.pool) 651 + .await? 652 + } else { 653 + sqlx::query_as!( 654 + Actor, 655 + r#" 656 + SELECT did, handle, slice_uri, indexed_at 657 + FROM actor 658 + WHERE slice_uri = $1 AND handle = $2 659 + ORDER BY did ASC 660 + LIMIT $3 661 + "#, 662 + slice_uri, 663 + handle_str, 664 + limit as i64 665 + ) 666 + .fetch_all(&self.pool) 667 + .await? 668 + } 669 + } else { 670 + // Default case with basic filtering 671 + self.query_actors_with_cursor(slice_uri, cursor, limit).await? 672 + } 673 + } else if let Some(did_condition) = conditions.get("did") { 597 674 if let Some(in_values) = &did_condition.in_values { 598 675 let string_values: Vec<String> = in_values.iter() 599 676 .filter_map(|v| v.as_str()) ··· 615 692 ) 616 693 .fetch_all(&self.pool) 617 694 .await? 695 + } else if let Some(eq_value) = &did_condition.eq { 696 + let did_str = eq_value.as_str().unwrap_or(""); 697 + if let Some(cursor_did) = cursor { 698 + sqlx::query_as!( 699 + Actor, 700 + r#" 701 + SELECT did, handle, slice_uri, indexed_at 702 + FROM actor 703 + WHERE slice_uri = $1 AND did = $2 AND did > $3 704 + ORDER BY did ASC 705 + LIMIT $4 706 + "#, 707 + slice_uri, 708 + did_str, 709 + cursor_did, 710 + limit as i64 711 + ) 712 + .fetch_all(&self.pool) 713 + .await? 714 + } else { 715 + sqlx::query_as!( 716 + Actor, 717 + r#" 718 + SELECT did, handle, slice_uri, indexed_at 719 + FROM actor 720 + WHERE slice_uri = $1 AND did = $2 721 + ORDER BY did ASC 722 + LIMIT $3 723 + "#, 724 + slice_uri, 725 + did_str, 726 + limit as i64 727 + ) 728 + .fetch_all(&self.pool) 729 + .await? 730 + } 618 731 } else { 619 732 // Default case with basic filtering 620 733 self.query_actors_with_cursor(slice_uri, cursor, limit).await?