├── .gitignore ├── README.md └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | node_modules 3 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fillout-express-api 2 | 3 | ## How to run 4 | 5 | ``` 6 | node server.js 7 | ``` 8 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const axios = require("axios"); 3 | 4 | const app = express(); 5 | const apiKey = process.env.apiKey; 6 | 7 | const axiosInstance = axios.create({ 8 | baseURL: "https://api.fillout.com", 9 | headers: { Authorization: `Bearer ${apiKey}` }, 10 | decompress: false, 11 | }); 12 | 13 | app.get("/:formId/filteredResponses", async (req, res) => { 14 | try { 15 | const { formId } = req.params; 16 | const { filters: filtersString, ...queryParams } = req.query; 17 | const filters = JSON.parse(filtersString); 18 | 19 | const response = await axiosInstance.get( 20 | `/v1/api/forms/${formId}`, 21 | // `/v1/api/forms/${formId}/submissions`, -> no response 22 | // `/v1/api/forms/${formId}`, no response either 23 | { 24 | params: queryParams, 25 | } 26 | ); 27 | 28 | const { totalResponses = 0, pageCount = 0 } = response.data; 29 | const responses = response.data.responses || []; 30 | 31 | console.log("response.data: ", response.data); 32 | 33 | const filteredResponses = responses.filter((response) => { 34 | return filters.every((filter) => { 35 | const question = response.questions.find((q) => q.id === filter.id); 36 | if (!question) return false; 37 | 38 | switch (filter.condition) { 39 | case "equals": 40 | return question.value === filter.value; 41 | case "does_not_equal": 42 | return question.value !== filter.value; 43 | case "greater_than": 44 | return new Date(question.value) > new Date(filter.value); 45 | case "less_than": 46 | return new Date(question.value) < new Date(filter.value); 47 | default: 48 | return false; 49 | } 50 | }); 51 | }); 52 | 53 | res.json({ 54 | responses: filteredResponses, 55 | totalResponses: filteredResponses.length, 56 | pageCount: Math.ceil(filteredResponses.length / queryParams.pageSize), 57 | }); 58 | } catch (error) { 59 | console.error(error); 60 | res.status(500).json({ error: "Internal Server Error" }); 61 | } 62 | }); 63 | 64 | const port = process.env.PORT || 3000; 65 | app.listen(port, () => { 66 | console.log(`Server is running on port ${port}`); 67 | }); 68 | --------------------------------------------------------------------------------