@@ -0,0 +1,233 @@
//
// r e q u e s t . s w i f t
// A I G r a m m a r
//
// C r e a t e d b y o s c a r o n 2 0 2 4 / 6 / 4 .
//
import Foundation
import Alamofire
import SwiftJWT
import SwiftyBeaver
struct MyClaims : Claims {
var deviceID : String
var gid : Int
var exp1 : Int
}
struct APIResponse < T : Decodable > : Decodable {
let ret : Int
let message : String
let data : T ?
}
struct Translation : Identifiable , Codable , Equatable {
var id = UUID ( )
var input : String
var translation : String
}
struct TranslationResponse : Codable {
let translation : String
}
struct WordDetails {
var word : String = " "
var explanations : [ String ] = [ ]
var phrases : [ String ] = [ ]
var synonyms : [ String ] = [ ]
}
struct WordDetailsResponse : Codable {
let word : String
let explain : [ String ] ?
let phrase : [ String ] ?
let sync : [ String ] ?
// M a p p i n g t o W o r d D e t a i l s f o r u s e i n U I
func toWordDetails ( ) -> WordDetails {
return WordDetails (
word : word ,
explanations : explain ? ? [ ] ,
phrases : phrase ? ? [ ] ,
synonyms : sync ? ? [ ]
)
}
}
struct VIPStatusResponse : Codable {
let id : Int
let userid : String
let username : String
let vip : Int
}
struct NetworkManager {
static let shared = NetworkManager ( )
private let jwtSecret = globalEnvironment . jwtSecret
// 语 法 检 查 功 能
func checkGrammar ( inputText : String , completion : @ escaping ( [ GrammarRes ] ? , Error ? ) -> Void ) {
let url = globalEnvironment . grammarURL
let headers : HTTPHeaders = createAuthorizationHeader ( )
let parameters : [ String : Any ] = [
" input " : inputText ,
" lang " : " eng "
]
AF . request ( url , method : . post , parameters : parameters , encoding : URLEncoding . httpBody , headers : headers )
. responseDecodable ( of : [ GrammarRes ] . self ) { response in
switch response . result {
case . success ( let results ) :
completion ( results , nil )
case . failure ( let error ) :
completion ( nil , error )
}
}
}
// 单 词 的 词 典 功 能
func fetchWordDetails ( inputText : String , lang : String = " eng " , completion : @ escaping ( Result < WordDetails , Error > ) -> Void ) {
guard ! inputText . isEmpty else { return }
let parameters : [ String : Any ] = [ " input " : inputText , " lang " : lang ]
let url = globalEnvironment . dictURL
let headers : HTTPHeaders = createAuthorizationHeader ( )
AF . request ( url , method : . post , parameters : parameters , encoding : URLEncoding . httpBody , headers : headers )
. responseDecodable ( of : WordDetailsResponse . self ) { response in
switch response . result {
case . success ( let detailsResponse ) :
print ( " Success: Received data for \( detailsResponse . word ) " )
let details = detailsResponse . toWordDetails ( ) // C o n v e r t h e r e
completion ( . success ( details ) )
case . failure ( let error ) :
print ( " Error: \( error ) " )
print ( " Response Data: \( String ( data : response . data ? ? Data ( ) , encoding : . utf8 ) ? ? " No data " ) " )
completion ( . failure ( error ) )
}
}
}
// 翻 译 功 能
func translate ( inputText : String , lang : String = " chs " , completion : @ escaping ( Result < Translation , Error > ) -> Void ) {
guard ! inputText . isEmpty else { return }
let url = globalEnvironment . translateURL
let parameters : [ String : Any ] = [ " input " : inputText , " lang " : lang ]
let headers : HTTPHeaders = createAuthorizationHeader ( )
AF . request ( url , method : . post , parameters : parameters , encoding : URLEncoding . httpBody , headers : headers )
. responseDecodable ( of : TranslationResponse . self ) { response in
switch response . result {
case . success ( let translationResponse ) :
let newTranslation = Translation ( input : inputText , translation : translationResponse . translation )
completion ( . success ( newTranslation ) )
case . failure ( let error ) :
completion ( . failure ( error ) )
}
}
}
// 翻 译 的 点 赞 、 点 踩 功 能
func sendFeedback ( input : String , output : String , isPositive : Bool ) {
let url = globalEnvironment . feedbackURL
let parameters : [ String : Any ] = [
" product " : " trans " ,
" input " : input ,
" output " : output ,
" res " : isPositive ? " good " : " bad "
]
let headers : HTTPHeaders = createAuthorizationHeader ( )
AF . request ( url , method : . post , parameters : parameters , encoding : URLEncoding . httpBody , headers : headers ) . response { response in
switch response . result {
case . success ( let data ) :
print ( " Feedback sent successfully: \( String ( describing : data ) ) " )
case . failure ( let error ) :
print ( " Error sending feedback: \( error ) " )
}
}
}
// 查 询 V I P 状 态
func getUserProfile ( completion : @ escaping ( Result < VIPStatusResponse , Error > ) -> Void ) {
let url = globalEnvironment . userURL
let parameters : [ String : Any ] = [ : ]
let headers : HTTPHeaders = createAuthorizationHeader ( )
performRequest (
endpoint : url ,
parameters : parameters ,
method : . post ,
encoding : URLEncoding . httpBody ,
headers : headers , // 示 例 : 使 用 J W T t o k e n
completion : { ( result : Result < VIPStatusResponse , Error > ) in
switch result {
case . success ( let vipData ) :
logger . info ( " VIP Status: \( vipData . vip ) " )
completion ( . success ( vipData ) )
case . failure ( let error ) :
logger . error ( " Error: \( error . localizedDescription ) " )
completion ( . failure ( error ) )
}
}
)
}
func performRequest < T : Decodable > (
endpoint : String ,
parameters : Parameters , // 明 确 使 用 A l a m o f i r e 的 P a r a m e t e r s 类 型
method : HTTPMethod = . post ,
encoding : URLEncoding = . httpBody ,
headers : HTTPHeaders ? = nil ,
completion : @ escaping ( Result < T , Error > ) -> Void
) {
let url = endpoint
let defaultHeaders : HTTPHeaders = [ . contentType ( " application/x-www-form-urlencoded " ) ]
let combinedHeaders = headers ? ? defaultHeaders
// 确 保 参 数 是 正 确 的 类 型
AF . request ( url , method : . post , parameters : parameters , encoding : encoding , headers : combinedHeaders ) . responseDecodable ( of : APIResponse < T > . self ) { response in
switch response . result {
case . success ( let apiResponse ) :
if apiResponse . ret = = 0 , let data = apiResponse . data {
completion ( . success ( data ) )
} else {
let error = NSError ( domain : " " , code : apiResponse . ret , userInfo : [ NSLocalizedDescriptionKey : apiResponse . message ] )
completion ( . failure ( error ) )
}
case . failure ( let error ) :
completion ( . failure ( error ) )
}
}
}
private func createAuthorizationHeader ( ) -> HTTPHeaders {
// G e n e r a t e J W T a n d r e t u r n h e a d e r s
guard let jwtToken = generateJWT ( deviceID : globalEnvironment . deviceID , gID : globalEnvironment . GID , jwtSecret : jwtSecret ) else {
return [ : ]
}
return [ " Authorization " : " Bearer \( jwtToken ) " ]
}
private func generateJWT ( deviceID : String , gID : Int , jwtSecret : String ) -> String ? {
let claims = MyClaims ( deviceID : deviceID , gid : gID , exp1 : Int ( Date ( ) . timeIntervalSince1970 ) + 86400 )
var jwt = JWT ( claims : claims )
do {
let jwtSigner = JWTSigner . hs256 ( key : Data ( jwtSecret . utf8 ) )
let signedJWT = try jwt . sign ( using : jwtSigner )
return signedJWT
} catch {
logger . error ( " JWT encoding failed with error: \( error ) " )
return nil
}
}
}