Для проекта на JavaScript с использованием JSON как базы данных, мы создадим базовую структуру с серверной частью на Node.js и Express.js, где данные опросов хранятся в JSON-файле. Вот как это может выглядеть:

### Структура проекта

```
project/
├── data/
│ └── surveys.json
├── app.js
└── package.json
```

### Шаг 1: Инициализация проекта

1. Создаем папку проекта и переходим в неё:

```bash
mkdir project
cd project
```

2. Инициализируем npm:

```bash
npm init -y
```

3. Устанавливаем Express.js:

```bash
npm install express
```

### Шаг 2: Создаем файл `surveys.json` для хранения опросов

Создаем папку `data` и файл `surveys.json` в ней с начальным содержимым:

```json
[]
```

Это будет массив объектов, где каждый объект — отдельный опрос.

### Шаг 3: Создаем файл `app.js` для серверной логики

Вот код для `app.js`:

```javascript
const express = require('express');
const fs = require('fs');
const app = express();

app.use(express.json());

const surveysFilePath = './data/surveys.json';

// Функция для чтения данных из файла
const readSurveys = () => {
const data = fs.readFileSync(surveysFilePath, 'utf-8');
return JSON.parse(data);
};

// Функция для записи данных в файл
const writeSurveys = (surveys) => {
fs.writeFileSync(surveysFilePath, JSON.stringify(surveys, null, 2));
};

// Создание нового опроса
app.post('/surveys', (req, res) => {
const surveys = readSurveys();
const newSurvey = { id: Date.now(), ...req.body, editable: true };
surveys.push(newSurvey);
writeSurveys(surveys);
res.status(201).json(newSurvey);
});

// Получение всех опросов
app.get('/surveys', (req, res) => {
const surveys = readSurveys();
res.json(surveys);
});

// Редактирование опроса (если он редактируемый)
app.put('/surveys/:id', (req, res) => {
const surveys = readSurveys();
const surveyId = parseInt(req.params.id);
const surveyIndex = surveys.findIndex(survey => survey.id === surveyId);

if (surveyIndex === -1) {
return res.status(404).json({ error: 'Survey not found' });
}

if (!surveys[surveyIndex].editable) {
return res.status(403).json({ error: 'Survey cannot be edited' });
}

surveys[surveyIndex] = { ...surveys[surveyIndex], ...req.body, editable: false };
writeSurveys(surveys);
res.json(surveys[surveyIndex]);

});

// Удаление опроса
app.delete('/surveys/:id', (req, res) => {
const surveys = readSurveys();
const surveyId = parseInt(req.params.id);
const newSurveys = surveys.filter(survey => survey.id !== surveyId);

if (newSurveys.length === surveys.length) {
return res.status(404).json({ error: 'Survey not found' });
}

writeSurveys(newSurveys);
res.status(204).send();

});

// Запуск сервера
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
```

### Пояснение к коду:

1. *Маршруты*:
- `POST /surveys` – создание нового опроса с полем `editable: true`.
- `GET /surveys` – получение всех опросов.
- `PUT /surveys/:id` – редактирование опроса по ID, если `editable: true`, после чего `editable` становится `false`.
- `DELETE /surveys/:id` – удаление опроса по ID.

2. *Функции*:
- `readSurveys` – читает данные из JSON-файла.
- `writeSurveys` – записывает данные в JSON-файл.

### Шаг 4: Запуск проекта

Запустите сервер командой:

```bash
node app.js
```

Теперь API будет доступен по адресу `http://localhost:3000`.