From 3547ef469b35ad8b7514ed0d2af71f54fb5e5f2b Mon Sep 17 00:00:00 2001
From: Jim Wallace <james.wallace@uwaterloo.ca>
Date: Sun, 17 Dec 2023 14:22:46 -0500
Subject: [PATCH] Sketch for Reddit Comment search

---
 .../Reddit/Reddit Enumerations.swift          | 17 +++++++---
 .../RedditClient + Comment Search.swift       | 31 +++++++++++++++++++
 .../Reddit/RedditDataItem.swift               |  2 +-
 .../Reddit API/RedditClient.swift             | 21 +++++++++++++
 4 files changed, 65 insertions(+), 6 deletions(-)
 create mode 100644 Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift

diff --git a/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift b/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift
index 0577a80c..a5325276 100644
--- a/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift	
+++ b/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift	
@@ -11,15 +11,22 @@ enum RedditContentType: String, CustomStringConvertible {
 
 enum ListingSortOrder: String, CustomStringConvertible {
     
-    case relevance = "relevance"
-    case hot       = "hot"
-    case top       = "top"
-    case new       = "new"
-    case comments  = "comments"
+    case relevance      = "relevance"
+    case hot            = "hot"
+    case top            = "top"
+    case new            = "new"
+    case old            = "old"
+    case random         = "random"
+    case qa             = "qa"
+    case live           = "live"
+    case comments       = "comments"
+    case confidence     = "confidence"
+    case controversial  = "controversial"
     
     var description: String { rawValue }
 }
 
+
 enum ListingTime: String, CustomStringConvertible {
     case hour   = "hour"
     case day    = "day"
diff --git a/Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift
new file mode 100644
index 00000000..4e41dafd
--- /dev/null
+++ b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift	
@@ -0,0 +1,31 @@
+import Foundation
+
+extension RedditClient {
+    
+    func searchComment(
+        article: RedditSubmission
+    ) async throws -> [RedditComment] {
+        
+        guard let subreddit = article.subreddit, let articleID = article.id
+        else {
+            throw RedditClientError(message: "Submission must include article data.")
+        }
+        
+        let (data, response) = try await _GET(
+            endpoint: "r/\(subreddit)/search/comment/\(articleID)",
+            parameters: parameters
+        )
+        
+        print(response)
+        print(data)
+        
+        do {
+            let redditListing = try JSONDecoder().decode([RedditComment].self, from: data)
+            return redditListing
+            
+        } catch {
+            throw RedditClientError(message: "Unable to decode server response.")
+        }
+    }
+    
+}
diff --git a/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift
index 39e9474f..6266b5fc 100644
--- a/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift	
+++ b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift	
@@ -1,4 +1,4 @@
-public protocol RedditDataItem: Encodable, Decodable, Equatable {
+public protocol RedditDataItem: Codable, Equatable {
     var created_utc: Int32? { get }
     var id: String? { get }
 }
diff --git a/Tests/SwiftNLPTests/Reddit API/RedditClient.swift b/Tests/SwiftNLPTests/Reddit API/RedditClient.swift
index 65f03c10..2a62c9b5 100644
--- a/Tests/SwiftNLPTests/Reddit API/RedditClient.swift	
+++ b/Tests/SwiftNLPTests/Reddit API/RedditClient.swift	
@@ -91,4 +91,25 @@ final class RedditClientTest: XCTestCase {
 
         XCTAssert(result.data.children.count > 0)
     }
+    
+//    func testCommentSearch() async throws {
+//        
+//        let id = ProcessInfo.processInfo.environment["REDDIT_CLIENT_ID"] ?? nil
+//        let secret = ProcessInfo.processInfo.environment["REDDIT_CLIENT_SECRET"] ?? nil
+//        
+//        guard let id = id, let secret = secret else {
+//            fatalError("Unable to fetch REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET from ProcessInfo.")
+//        }
+//        
+//        let client = RedditClient(id: id, secret: secret)
+//        guard let _ = try? await client.authenticate() else {
+//            throw RedditClientError(message: "Error authenticating client.")
+//        }
+//        
+//        let submission = RedditSubmission()
+//        
+//        let result = try await client.searchComment(article: nil)
+//
+//        XCTAssert(result.data.children.count > 0)
+//    }
 }
-- 
GitLab