@@ -3,6 +3,7 @@ import bodyParser from "body-parser";
3
3
import cors from "cors" ;
4
4
import path from "path" ;
5
5
import fs from "fs" ;
6
+ import { getFolderByUserAddress } from "./tusky" ;
6
7
7
8
import {
8
9
type AgentRuntime ,
@@ -56,7 +57,13 @@ export function createApiRouter(
56
57
) {
57
58
const router = express . Router ( ) ;
58
59
59
- router . use ( cors ( ) ) ;
60
+ router . use ( ( req , res , next ) => {
61
+ res . header ( "Access-Control-Allow-Origin" , "*" ) ;
62
+ res . header ( "Access-Control-Allow-Methods" , "GET, POST, OPTIONS" ) ;
63
+ res . header ( "Access-Control-Allow-Headers" , "Content-Type" ) ;
64
+ next ( ) ;
65
+ } ) ;
66
+
60
67
router . use ( bodyParser . json ( ) ) ;
61
68
router . use ( bodyParser . urlencoded ( { extended : true } ) ) ;
62
69
router . use (
@@ -73,6 +80,78 @@ export function createApiRouter(
73
80
res . json ( { message : "Hello World!" } ) ;
74
81
} ) ;
75
82
83
+ router . get ( "/data" , async ( req , res ) => {
84
+ res . header ( "Access-Control-Allow-Origin" , "*" ) ;
85
+ res . header ( "Access-Control-Allow-Methods" , "GET, POST, OPTIONS" ) ;
86
+ res . header ( "Access-Control-Allow-Headers" , "Content-Type" ) ;
87
+
88
+ try {
89
+ const userAddress = "0xb4b291607e91da4654cab88e5e35ba2921ef68f1b43725ef2faeae045bf5915d" ;
90
+ const rawData = await getFolderByUserAddress ( userAddress ) ;
91
+
92
+ if ( ! rawData || typeof rawData === "string" ) {
93
+ throw new Error ( "No valid data found" ) ;
94
+ }
95
+
96
+ const datapost = rawData . map ( ( item ) => {
97
+ const data = item . data ;
98
+ if ( Array . isArray ( data ) ) {
99
+ return data . map ( i => i . text ) . filter ( Boolean ) ;
100
+ } else if ( typeof data === "object" && data !== null ) {
101
+ return data . text ? [ data . text ] : [ ] ;
102
+ }
103
+ return [ ] ;
104
+ } ) . flat ( ) ;
105
+
106
+ if ( datapost . length === 0 ) {
107
+ throw new Error ( "No valid text content found in the data" ) ;
108
+ }
109
+
110
+ // **Tự động phát hiện danh mục dựa trên từ khóa xuất hiện**
111
+ const detectCategory = ( post ) => {
112
+ if ( post . match ( / \b ( c r y p t o | b i t c o i n | e t h | n f t | b l o c k c h a i n | w e b 3 | a i r d r o p | t o k e n | m e m e c o i n | w a l l e t | s u i | s o l a n a ) \b / i) ) return "CRYPTO" ;
113
+ if ( post . match ( / \b ( a i | m l | m a c h i n e l e a r n i n g | n e u r a l | c h a t b o t | g r o k | x a i ) \b / i) ) return "ML_AI" ;
114
+ if ( post . match ( / \b ( d e v | c o d e | p r o t o c o l | e x t e n s i o n | a p i | s d k | f r a m e w o r k | s m a r t c o n t r a c t | d a p p ) \b / i) ) return "DEVELOPMENT" ;
115
+ if ( post . match ( / \b ( d e f i | f i n a n c e | p a y m e n t | t r a d i n g | s w a p | y i e l d | l e n d i n g | s t a k i n g ) \b / i) ) return "DEFI" ;
116
+ if ( post . match ( / \b ( t w i t t e r | s o c i a l | c o m m u n i t y | f o l l o w | r t | l i k e | e n g a g e m e n t ) \b / i) ) return "SOCIAL" ;
117
+ if ( post . match ( / \b ( m a r k e t | p r i c e | p u m p | d u m p | b u l l | b e a r | t r e n d | s e a s o n | a l t c o i n ) \b / i) ) return "MARKET" ;
118
+ if ( post . match ( / \b ( n e w s | u p d a t e | a n n o u n c e m e n t | l a u n c h | r e l e a s e | p r o g r e s s ) \b / i) ) return "NEWS" ;
119
+ if ( post . match ( / \b ( g a m e | g a m i n g | p l a y | r e w a r d | n a r u t o ) \b / i) ) return "GAMING" ;
120
+ if ( post . match ( / \b ( e v e n t | h a c k a t h o n | c o m p e t i t i o n | p r i z e | r e g i s t e r | j o i n ) \b / i) ) return "EVENTS" ;
121
+ return "Other" ; // Nếu không xác định được danh mục
122
+ } ;
123
+
124
+ // **Nhóm bài viết theo danh mục tự động**
125
+ const categorizedPosts = { } ;
126
+
127
+ datapost . forEach ( ( post , index ) => {
128
+ const category = detectCategory ( post ) ;
129
+ if ( ! categorizedPosts [ category ] ) {
130
+ categorizedPosts [ category ] = [ ] ;
131
+ }
132
+ categorizedPosts [ category ] . push ( { id : index + 1 , content : post } ) ;
133
+ } ) ;
134
+
135
+ const result = Object . keys ( categorizedPosts ) . map ( category => {
136
+ const posts = categorizedPosts [ category ] ;
137
+ return {
138
+ parentId : category ,
139
+ content : posts [ 0 ] . content ,
140
+ posts : posts . slice ( 1 )
141
+ } ;
142
+ } ) ;
143
+
144
+ res . json ( result ) ;
145
+
146
+ } catch ( error ) {
147
+ res . status ( 500 ) . json ( {
148
+ error : error . message ,
149
+ timestamp : new Date ( ) . toISOString ( )
150
+ } ) ;
151
+ }
152
+ } ) ;
153
+
154
+
76
155
router . get ( "/agents" , ( req , res ) => {
77
156
const agentsList = Array . from ( agents . values ( ) ) . map ( ( agent ) => ( {
78
157
id : agent . agentId ,
0 commit comments