insert at index, change index
This commit is contained in:
parent
cc2f4fea84
commit
621d6b812c
@ -88,7 +88,7 @@ Returns all of `:domain`'s DNS records or performs a search based on provided qu
|
|||||||
```
|
```
|
||||||
|
|
||||||
### `POST /zone/records/:domain`
|
### `POST /zone/records/:domain`
|
||||||
Updates or marks for deletion a single or multiple DNS records of `:domain` at `index`.
|
Updates or marks for deletion a single or multiple DNS records of `:domain` at `index`. **Warning:** `setIndex` will cause your other records to shift around, so it is currently only recommended to use for a single record at a time.
|
||||||
|
|
||||||
**Body:**
|
**Body:**
|
||||||
```typescript
|
```typescript
|
||||||
@ -98,6 +98,7 @@ Updates or marks for deletion a single or multiple DNS records of `:domain` at `
|
|||||||
name?: string;
|
name?: string;
|
||||||
type?: string;
|
type?: string;
|
||||||
value?: string;
|
value?: string;
|
||||||
|
setIndex?: number;
|
||||||
forDeletion?: boolean;
|
forDeletion?: boolean;
|
||||||
} | {...}[];
|
} | {...}[];
|
||||||
}
|
}
|
||||||
@ -126,6 +127,7 @@ Creates a single or multiple new DNS records for `:domain`.
|
|||||||
name: string;
|
name: string;
|
||||||
type: string;
|
type: string;
|
||||||
value: string;
|
value: string;
|
||||||
|
index?: number; // insert at this exact index (not after this index, at it!)
|
||||||
} | {...}[];
|
} | {...}[];
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
35
src/index.ts
35
src/index.ts
@ -107,6 +107,7 @@ api.get('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
|||||||
* name?: string;
|
* name?: string;
|
||||||
* type?: DNSRecordType;
|
* type?: DNSRecordType;
|
||||||
* value?: string;
|
* value?: string;
|
||||||
|
* setIndex?: number;
|
||||||
* forDeletion?: boolean;
|
* forDeletion?: boolean;
|
||||||
* }[];
|
* }[];
|
||||||
*/
|
*/
|
||||||
@ -191,9 +192,24 @@ api.post('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (setter.setIndex) {
|
||||||
|
const afterI = parseInt(setter.setIndex, 10);
|
||||||
|
if (isNaN(afterI) || afterI > zone.records.length) {
|
||||||
|
errors.push({
|
||||||
|
message: 'Invalid insertion location!',
|
||||||
|
record
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
zone.records[index] = { ...record, forDeletion: true };
|
||||||
|
zone.records.splice(afterI, 0, record);
|
||||||
|
changed.push({ ...record, index: afterI });
|
||||||
|
} else {
|
||||||
zone.records[index] = record;
|
zone.records[index] = record;
|
||||||
changed.push(record);
|
changed.push(record);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await cache.update(domain, cached);
|
await cache.update(domain, cached);
|
||||||
|
|
||||||
@ -264,6 +280,7 @@ api.delete('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
|||||||
* name: string;
|
* name: string;
|
||||||
* type: DNSRecordType;
|
* type: DNSRecordType;
|
||||||
* value: string;
|
* value: string;
|
||||||
|
* index?: number;
|
||||||
* }[];
|
* }[];
|
||||||
*/
|
*/
|
||||||
api.put('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
api.put('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
||||||
@ -320,7 +337,7 @@ api.put('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
|||||||
if (!validator.validateRecord(newRecord)) {
|
if (!validator.validateRecord(newRecord)) {
|
||||||
errors.push({
|
errors.push({
|
||||||
message: 'Validation error: Invalid characters',
|
message: 'Validation error: Invalid characters',
|
||||||
record: setter
|
record: newRecord
|
||||||
});
|
});
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -328,14 +345,28 @@ api.put('/zone/records/:domain', domainAuthorization, async (req, res) => {
|
|||||||
if (cache.search(cached, name, upperType, value, true).length) {
|
if (cache.search(cached, name, upperType, value, true).length) {
|
||||||
errors.push({
|
errors.push({
|
||||||
message: 'Exact same record already exists. No need to duplicate records!',
|
message: 'Exact same record already exists. No need to duplicate records!',
|
||||||
record: setter
|
record: newRecord
|
||||||
});
|
});
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (setter.index) {
|
||||||
|
const afterI = parseInt(setter.index, 10);
|
||||||
|
if (isNaN(afterI) || afterI > zone.records.length) {
|
||||||
|
errors.push({
|
||||||
|
message: 'Invalid insertion location!',
|
||||||
|
record: newRecord
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
zone.records.splice(afterI, 0, newRecord);
|
||||||
|
created.push({ ...newRecord, index: afterI });
|
||||||
|
} else {
|
||||||
const index = zone.records.push(newRecord) - 1;
|
const index = zone.records.push(newRecord) - 1;
|
||||||
created.push({ ...newRecord, index });
|
created.push({ ...newRecord, index });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await cache.update(domain, cached);
|
await cache.update(domain, cached);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user