1
0
Fork 0
mirror of https://github.com/Luzifer/go-holidays.git synced 2024-12-25 13:21:17 +00:00

Allow filtering holidays by month and date

This commit is contained in:
Knut Ahlers 2017-02-02 11:17:58 +01:00
parent 9fe048b5d0
commit 849af883e3
Signed by: luzifer
GPG key ID: DC2729FDD34BE99E
2 changed files with 21 additions and 4 deletions

View file

@ -31,12 +31,17 @@ This instance of `holiday-api` is a convenient wrapper around my [go-holiday lib
## Usage ## Usage
The supported URL scheme is `/{country-code}/{year}` while `{year}` is optional and if not set the current year is used. The supported URL scheme is `/{country-code}/{year}/{month}/{day}`:
- `{country-code}` **(required)** - ISO 3166-1 alpha-2 country code
- `{year}` _(optional)_ - If not set the current year is used
- `{month}` _(optional)_ - If specified list is filtered for given month
- `{day}` _(optional)_ - If specified list is filtered for given day
Examples: Examples:
- [`/us`](/us) - Federal holidays for the United States for the current year - [`/us`](/us) - Federal holidays for the United States for the current year
- [`/de/2017`](/de/2017) - National holidays in Germany for 2017 - [`/de/2017`](/de/2017) - National holidays in Germany for 2017
- [`/de-by/2017`](/de-by/2017) - Holidays for Bavaria for 2017 (Uses [ISO 3166-2:DE](https://en.wikipedia.org/wiki/ISO_3166-2:DE) codes) - [`/de-by/2017`](/de-by/2017) - Holidays for Bavaria for 2017 (Uses [ISO 3166-2:DE](https://en.wikipedia.org/wiki/ISO_3166-2:DE) codes)
- [`/de-by/2017/10`](/de-by/2017/10) - Holidays for Bavaria for October 2017
No request limits are enforced so please play nice with the API. No request limits are enforced so please play nice with the API.
@ -44,7 +49,7 @@ No request limits are enforced so please play nice with the API.
The API will respond with The API will respond with
- `HTTP 200` and a JSON array if the query was successful - `HTTP 200` and a JSON array if the query was successful
- `HTTP 404` if your URL is nvalid. - `HTTP 404` if your URL is invalid.
- `HTTP 500` if the requested country-code is not included / supported - `HTTP 500` if the requested country-code is not included / supported
### JSON format ### JSON format

View file

@ -9,6 +9,7 @@ import (
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
"strings"
"time" "time"
holidays "github.com/Luzifer/go-holidays" holidays "github.com/Luzifer/go-holidays"
@ -38,6 +39,8 @@ func init() {
func main() { func main() {
r := mux.NewRouter() r := mux.NewRouter()
r.HandleFunc("/{country-code:[a-z-]+}/{year:[0-9]{4}}/{month:[0-9]{2}}/{day:[0-9]{2}}", handleHolidays)
r.HandleFunc("/{country-code:[a-z-]+}/{year:[0-9]{4}}/{month:[0-9]{2}}", handleHolidays)
r.HandleFunc("/{country-code:[a-z-]+}/{year:[0-9]{4}}", handleHolidays) r.HandleFunc("/{country-code:[a-z-]+}/{year:[0-9]{4}}", handleHolidays)
r.HandleFunc("/{country-code:[a-z-]+}", handleHolidays) r.HandleFunc("/{country-code:[a-z-]+}", handleHolidays)
r.HandleFunc("/", handleReadme) r.HandleFunc("/", handleReadme)
@ -60,14 +63,23 @@ func handleHolidays(res http.ResponseWriter, r *http.Request) {
} }
} }
holidays, err := holidays.GetHolidays(countryCode, year) check := strings.TrimRight(strings.Join([]string{strconv.Itoa(year), vars["month"], vars["day"]}, "-"), "-")
days, err := holidays.GetHolidays(countryCode, year)
if err != nil { if err != nil {
http.Error(res, "An error ocurred: "+err.Error(), http.StatusInternalServerError) http.Error(res, "An error ocurred: "+err.Error(), http.StatusInternalServerError)
return return
} }
outputSet := []holidays.Holiday{}
for _, h := range days {
if strings.HasPrefix(h.Date, check) {
outputSet = append(outputSet, h)
}
}
res.Header().Set("Content-Type", "application/json") res.Header().Set("Content-Type", "application/json")
json.NewEncoder(res).Encode(holidays) json.NewEncoder(res).Encode(outputSet)
} }
func handleReadme(res http.ResponseWriter, r *http.Request) { func handleReadme(res http.ResponseWriter, r *http.Request) {