@@ -27,54 +27,105 @@ import (
27
27
28
28
var port string
29
29
30
- // Handler : handles serving gophie
31
- func Handler (w http.ResponseWriter , r * http.Request ) {
32
- search := r .URL .Query ().Get ("search" )
33
- list := r .URL .Query ().Get ("list" )
30
+ func enableCors (w * http.ResponseWriter ) {
31
+ (* w ).Header ().Set ("Access-Control-Allow-Origin" , "*" )
32
+ }
33
+
34
+ func getDefaultsMiddleware (handler http.HandlerFunc ) http.HandlerFunc {
35
+ return func (w http.ResponseWriter , r * http.Request ) {
36
+ enableCors (& w )
37
+ w .Header ().Add ("Content-Type" , "application/json" )
38
+
39
+ // Set Default Engine to NetNaija
40
+ engine := r .URL .Query ().Get ("engine" )
41
+ if engine == "" {
42
+ q := r .URL .Query ()
43
+ q .Add ("engine" , "netnaija" )
44
+ r .URL .RawQuery = q .Encode ()
45
+ }
46
+ handler .ServeHTTP (w , r )
47
+ }
48
+ }
49
+
50
+ // ListHandler : handles List Requests
51
+ func ListHandler (w http.ResponseWriter , r * http.Request ) {
34
52
eng := r .URL .Query ().Get ("engine" )
53
+ site , err := engine .GetEngine (eng )
54
+ if site == nil {
55
+ http .Error (w , "Invalid Engine Param" , http .StatusBadRequest )
56
+ }
57
+ pageNum , err := strconv .Atoi (r .URL .Query ().Get ("page" ))
58
+ if err != nil {
59
+ http .Error (w , "Page must be a number" , http .StatusBadRequest )
60
+ }
61
+
62
+ log .Debug ("listing page " , pageNum )
63
+ result := site .List (pageNum )
64
+ b , err := json .Marshal (result .Movies )
65
+ if err != nil {
66
+ log .Fatal ("failed to serialize response: " , err )
67
+ http .Error (w , "Internal Server Error" , http .StatusInternalServerError )
68
+ }
69
+ w .Header ().Add ("Content-Type" , "application/json" )
70
+ w .Write (b )
71
+ log .Debug ("Completed query for " , pageNum )
72
+ }
73
+
74
+ // SearchHandler : handles search requests
75
+ func SearchHandler (w http.ResponseWriter , r * http.Request ) {
35
76
var (
36
77
result engine.SearchResult
37
78
site engine.Engine
38
79
)
39
- if search == "" && list == "" {
40
- log .Debug ("missing search and list argument" )
41
- http .Error (w , "search and list argument is missing in url" , http .StatusForbidden )
42
- return
43
- }
44
- if eng == "" {
45
- // Use NetNaija as the default engine
46
- site = engine .NewNetNaijaEngine ()
47
- } else {
48
- site = engine .GetEngine (eng )
80
+ query := r .URL .Query ().Get ("query" )
81
+ if query == "" {
82
+ http .Error (w , "Query param must be added to url" , http .StatusBadRequest )
49
83
}
50
84
51
- log .Debug ("Using Engine " , site )
52
- if search != "" {
53
- log .Debug ("Searching for " , search )
54
- result = site .Search (search )
55
- } else if list != "" {
56
- log .Debug ("listing page " , list )
57
- pagenum , err := strconv .Atoi (list )
58
- if err != nil {
59
- http .Error (w , "Page must be a number" , http .StatusBadRequest )
60
- }
61
- result = site .List (pagenum )
85
+ eng := r .URL .Query ().Get ("engine" )
86
+ site , err := engine .GetEngine (eng )
87
+ if err != nil {
88
+ http .Error (w , "Invalid Engine Param" , http .StatusBadRequest )
62
89
}
90
+ log .Debug ("Using Engine " , site )
91
+ log .Debug ("Searching for " , query )
92
+ result = site .Search (query )
63
93
64
94
// dump results
65
95
b , err := json .Marshal (result .Movies )
66
96
if err != nil {
67
- log .Fatal ("failed to serialize response: " , err )
97
+ log .Error ("failed to serialize response: " , err )
68
98
http .Error (w , "Internal Server Error" , http .StatusInternalServerError )
69
99
}
70
- enableCors (& w )
71
- w .Header ().Add ("Content-Type" , "application/json" )
72
100
w .Write (b )
73
- log .Debug ("Completed search for " , search , list )
101
+ log .Debug ("Completed search for " , query )
74
102
}
75
103
76
- func enableCors (w * http.ResponseWriter ) {
77
- (* w ).Header ().Set ("Access-Control-Allow-Origin" , "*" )
104
+ // EngineHandler : handles Engine Listing
105
+ func EngineHandler (w http.ResponseWriter , r * http.Request ) {
106
+ eng := r .URL .Query ().Get ("engine" )
107
+ var (
108
+ response []byte
109
+ err error
110
+ )
111
+ if eng != "" {
112
+ site , err := engine .GetEngine (eng )
113
+ if err != nil {
114
+ http .Error (w , "Invalid Engine Param" , http .StatusBadRequest )
115
+ }
116
+ response , err = json .Marshal (site )
117
+ if err != nil {
118
+ log .Error ("failed to serialize response: " , err )
119
+ http .Error (w , "Internal Server Error" , http .StatusInternalServerError )
120
+ }
121
+ } else {
122
+ response , err = json .Marshal (engine .GetEngines ())
123
+ if err != nil {
124
+ log .Error ("failed to serialize response: " , err )
125
+ http .Error (w , "Internal Server Error" , http .StatusInternalServerError )
126
+ }
127
+ }
128
+ w .Write (response )
78
129
}
79
130
80
131
// apiCmd represents the api command
@@ -83,7 +134,10 @@ var apiCmd = &cobra.Command{
83
134
Short : "host gophie as an API on a PORT env variable, fallback to set argument" ,
84
135
Long : `` ,
85
136
Run : func (cmd * cobra.Command , args []string ) {
86
- http .HandleFunc ("/" , Handler )
137
+ http .HandleFunc ("/search" , getDefaultsMiddleware (SearchHandler ))
138
+ http .HandleFunc ("/list" , getDefaultsMiddleware (ListHandler ))
139
+ http .HandleFunc ("/engine" , EngineHandler )
140
+
87
141
log .Info ("listening on " , port )
88
142
_ , err := strconv .Atoi (port )
89
143
if err != nil {
0 commit comments