@@ -4,6 +4,7 @@ import Router from 'express-promise-router';
44import {
55 StackOverflowAPI ,
66 StackOverflowConfig ,
7+ QuestionFilters ,
78} from './services/StackOverflowService/types' ;
89import { createStackOverflowAuth } from './api' ;
910
@@ -51,6 +52,45 @@ export async function createRouter({
5152 }
5253 }
5354
55+ // Helper function to build question filters from query parameters
56+ function buildQuestionFilters ( query : any ) : QuestionFilters | undefined {
57+ const filters : QuestionFilters = { } ;
58+ let hasFilters = false ;
59+
60+ if ( query . sort && [ 'activity' , 'creation' , 'score' ] . includes ( query . sort ) ) {
61+ filters . sort = query . sort ;
62+ hasFilters = true ;
63+ }
64+
65+ if ( query . order && [ 'asc' , 'desc' ] . includes ( query . order ) ) {
66+ filters . order = query . order ;
67+ hasFilters = true ;
68+ }
69+
70+ if ( query . isAnswered !== undefined ) {
71+ filters . isAnswered = query . isAnswered === 'true' ;
72+ hasFilters = true ;
73+ }
74+
75+ if ( query . page !== undefined ) {
76+ const page = parseInt ( query . page , 10 ) ;
77+ if ( ! isNaN ( page ) && page > 0 ) {
78+ filters . page = page ;
79+ hasFilters = true ;
80+ }
81+ }
82+
83+ if ( query . pageSize !== undefined ) {
84+ const pageSize = parseInt ( query . pageSize , 10 ) ;
85+ if ( ! isNaN ( pageSize ) && pageSize > 0 ) {
86+ filters . pageSize = pageSize ;
87+ hasFilters = true ;
88+ }
89+ }
90+
91+ return hasFilters ? filters : undefined ;
92+ }
93+
5494 // OAuth Authentication routes
5595
5696 router . get ( '/auth/start' , async ( _req : Request , res : Response ) => {
@@ -256,6 +296,7 @@ export async function createRouter({
256296 }
257297 } ) ;
258298
299+ // Updated questions route with filtering support
259300 router . get ( '/questions' , async ( req : Request , res : Response ) => {
260301 try {
261302 const authToken = getValidAuthToken ( req , res ) ;
@@ -264,17 +305,99 @@ export async function createRouter({
264305 . status ( 401 )
265306 . json ( { error : 'Missing Stack Overflow Teams Access Token' } ) ;
266307 }
267- const questions = await stackOverflowService . getQuestions ( authToken ) ;
308+
309+ const filters = buildQuestionFilters ( req . query ) ;
310+ const questions = await stackOverflowService . getQuestions ( authToken , filters ) ;
268311 return res . send ( questions ) ;
269312 } catch ( error : any ) {
270- // Fix type issue when including the error for some reason
271313 logger . error ( 'Error fetching questions' , { error } ) ;
272314 return res . status ( 500 ) . send ( {
273315 error : `Failed to fetch questions from the Stack Overflow instance` ,
274316 } ) ;
275317 }
276318 } ) ;
277319
320+ // Convenience routes for common question filtering scenarios
321+ router . get ( '/questions/active' , async ( req : Request , res : Response ) => {
322+ try {
323+ const authToken = getValidAuthToken ( req , res ) ;
324+ if ( ! authToken ) {
325+ return res
326+ . status ( 401 )
327+ . json ( { error : 'Missing Stack Overflow Teams Access Token' } ) ;
328+ }
329+
330+ const page = req . query . page ? parseInt ( req . query . page as string , 10 ) : undefined ;
331+ const questions = await stackOverflowService . getActiveQuestions ( authToken , page ) ;
332+ return res . send ( questions ) ;
333+ } catch ( error : any ) {
334+ logger . error ( 'Error fetching active questions' , { error } ) ;
335+ return res . status ( 500 ) . send ( {
336+ error : `Failed to fetch active questions from the Stack Overflow instance` ,
337+ } ) ;
338+ }
339+ } ) ;
340+
341+ router . get ( '/questions/newest' , async ( req : Request , res : Response ) => {
342+ try {
343+ const authToken = getValidAuthToken ( req , res ) ;
344+ if ( ! authToken ) {
345+ return res
346+ . status ( 401 )
347+ . json ( { error : 'Missing Stack Overflow Teams Access Token' } ) ;
348+ }
349+
350+ const page = req . query . page ? parseInt ( req . query . page as string , 10 ) : undefined ;
351+ const questions = await stackOverflowService . getNewestQuestions ( authToken , page ) ;
352+ return res . send ( questions ) ;
353+ } catch ( error : any ) {
354+ logger . error ( 'Error fetching newest questions' , { error } ) ;
355+ return res . status ( 500 ) . send ( {
356+ error : `Failed to fetch newest questions from the Stack Overflow instance` ,
357+ } ) ;
358+ }
359+ } ) ;
360+
361+ router . get ( '/questions/top-scored' , async ( req : Request , res : Response ) => {
362+ try {
363+ const authToken = getValidAuthToken ( req , res ) ;
364+ if ( ! authToken ) {
365+ return res
366+ . status ( 401 )
367+ . json ( { error : 'Missing Stack Overflow Teams Access Token' } ) ;
368+ }
369+
370+ const page = req . query . page ? parseInt ( req . query . page as string , 10 ) : undefined ;
371+ const questions = await stackOverflowService . getTopScoredQuestions ( authToken , page ) ;
372+ return res . send ( questions ) ;
373+ } catch ( error : any ) {
374+ logger . error ( 'Error fetching top scored questions' , { error } ) ;
375+ return res . status ( 500 ) . send ( {
376+ error : `Failed to fetch top scored questions from the Stack Overflow instance` ,
377+ } ) ;
378+ }
379+ } ) ;
380+
381+ router . get ( '/questions/unanswered' , async ( req : Request , res : Response ) => {
382+ try {
383+ const authToken = getValidAuthToken ( req , res ) ;
384+ if ( ! authToken ) {
385+ return res
386+ . status ( 401 )
387+ . json ( { error : 'Missing Stack Overflow Teams Access Token' } ) ;
388+ }
389+
390+ const page = req . query . page ? parseInt ( req . query . page as string , 10 ) : undefined ;
391+ const questions = await stackOverflowService . getUnansweredQuestions ( authToken , page ) ;
392+ return res . send ( questions ) ;
393+ } catch ( error : any ) {
394+ logger . error ( 'Error fetching unanswered questions' , { error } ) ;
395+ return res . status ( 500 ) . send ( {
396+ error : `Failed to fetch unanswered questions from the Stack Overflow instance` ,
397+ } ) ;
398+ }
399+ } ) ;
400+
278401 router . get ( '/tags' , async ( req : Request , res : Response ) => {
279402 try {
280403 const authToken = getValidAuthToken ( req , res ) ;
@@ -315,7 +438,7 @@ export async function createRouter({
315438 router . post ( '/search' , async ( req : Request , res : Response ) => {
316439 try {
317440 const authToken = getValidAuthToken ( req , res ) ;
318- const { query } = req . body ;
441+ const { query, page } = req . body ;
319442
320443 if ( ! authToken ) {
321444 return res
@@ -325,6 +448,7 @@ export async function createRouter({
325448 const searchResults = await stackOverflowService . getSearch (
326449 query ,
327450 authToken ,
451+ page
328452 ) ;
329453 return res . status ( 201 ) . json ( searchResults ) ;
330454 } catch ( error : any ) {
@@ -367,4 +491,4 @@ export async function createRouter({
367491 } ) ;
368492
369493 return router ;
370- }
494+ }
0 commit comments