Skip to content

Commit

Permalink
✔ Fansub DNS
Browse files Browse the repository at this point in the history
  • Loading branch information
bifeldy committed Apr 30, 2023
1 parent 97526b0 commit 1f4f96c
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 89 deletions.
2 changes: 1 addition & 1 deletion dist/fansubid/browser/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<noscript>🎉 Harap Menyalakan JavaScript Untuk Dapat Mengakses Website Ini ✨</noscript>
</div>
<app-root></app-root>
<script src="runtime.c58400fc93d5aa8a.js" type="module"></script><script src="polyfills.325a71d3e423341a.js" type="module"></script><script src="scripts.03e7a8120a25f41a.js" defer></script><script src="main.438081f82b3be59f.js" type="module"></script>
<script src="runtime.c58400fc93d5aa8a.js" type="module"></script><script src="polyfills.325a71d3e423341a.js" type="module"></script><script src="scripts.03e7a8120a25f41a.js" defer></script><script src="main.7036a8be948dae49.js" type="module"></script>


</body></html>
1 change: 0 additions & 1 deletion dist/fansubid/browser/main.438081f82b3be59f.js

This file was deleted.

1 change: 1 addition & 0 deletions dist/fansubid/browser/main.7036a8be948dae49.js

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions dist/fansubid/browser/ngsw.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"configVersion": 1,
"timestamp": 1682845245918,
"timestamp": 1682853823652,
"index": "/index.html",
"assetGroups": [
{
Expand Down Expand Up @@ -39,7 +39,7 @@
"/common.352e8983d5b95d05.js",
"/favicon.ico",
"/index.html",
"/main.438081f82b3be59f.js",
"/main.7036a8be948dae49.js",
"/manifest.webmanifest",
"/polyfills.325a71d3e423341a.js",
"/runtime.c58400fc93d5aa8a.js",
Expand Down Expand Up @@ -110,8 +110,8 @@
"/938.ff68b5c4111cea5e.js": "080c0a983ed364772d347904ee047a1536afb931",
"/common.352e8983d5b95d05.js": "177e7ac9ed10a52b1fcd43bf59721e0ede7d7bec",
"/favicon.ico": "071facb8fab2e4b3493dcfbb0b02d7bd21bca97e",
"/index.html": "a334a9a96662eff02f1f05ed46bfb702aaf9a7d8",
"/main.438081f82b3be59f.js": "9b898712df4206442dd6e18c48113f025246ca53",
"/index.html": "4df654cb19f1f658903d2963b1049da7c97925e1",
"/main.7036a8be948dae49.js": "2cf05b58bdc97adc4a422f6da86252044507b9c5",
"/manifest.webmanifest": "eafb5426cdc9fd714787e5453af315b9972875a3",
"/polyfills.325a71d3e423341a.js": "18f8a8b77e7d11be1385d438c6d218cc68c0edb3",
"/runtime.c58400fc93d5aa8a.js": "451c08e996608473517fbcb54fc183a43d278473",
Expand Down
2 changes: 1 addition & 1 deletion dist/fansubid/server/main.js

Large diffs are not rendered by default.

189 changes: 111 additions & 78 deletions src/api/controllers/fansub-/fansub-dns.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { environment } from '../../../environments/api/environment';

import { CONSTANTS } from '../../../constants';

import { RoleModel, UserModel } from '../../../models/req-res.model';
import { FansubModel, RoleModel, UserModel } from '../../../models/req-res.model';

import { FilterApiKeyAccess } from '../../decorators/filter-api-key-access.decorator';
import { Roles } from '../../decorators/roles.decorator';
Expand All @@ -34,10 +34,10 @@ export class FansubDnsController {
//
}

async createNewDns(obj): Promise<any> {
const req = obj.req;
const user = obj.user;
let fansub = obj.fansub;
async createNewOrUpdateDns(obj): Promise<any> {
const req: Request = obj.req;
const user: UserModel = obj.user;
let fansub: FansubModel = obj.fansub;
const result = {
dns_id: null,
dns_id_alt: null
Expand All @@ -47,62 +47,108 @@ export class FansubDnsController {
if (serverTarget.match(CONSTANTS.regexIpAddress)) {
recordType = 'A';
}
const dns_id = await this.cfs.createDns(fansub.slug, serverTarget, recordType);
if (dns_id) {
if (dns_id.status >= 200 && dns_id.status < 400) {
fansub.dns_id = dns_id.result.id;
result.dns_id = {
id: dns_id.result.id,
name: dns_id.result.name,
content: dns_id.result.content,
proxied: dns_id.result.proxied,
ttl: dns_id.result.ttl,
type: dns_id.result.type,
created_at: dns_id.result.created_on,
updated_at: dns_id.result.modified_on
};
if (recordType === 'A' && fansub.dns_id_alt) {
const dns_id_alt_delete = await this.cfs.deleteDns(fansub.dns_id_alt);
if (dns_id_alt_delete && dns_id_alt_delete.status >= 200 && dns_id_alt_delete.status < 400) {
fansub.dns_id_alt = null;
fansub = await this.fansubRepo.save(fansub);
}
}
let isUpdateMode = false;
if (fansub.dns_id) {
const dns_id_detail = await this.cfs.detailDns(fansub.dns_id);
if (dns_id_detail && dns_id_detail.status >= 200 && dns_id_detail.status < 400) {
if (dns_id_detail.result.type === recordType) {
isUpdateMode = true;
} else {
const dns_id_delete = await this.cfs.deleteDns(fansub.dns_id);
if (dns_id_delete && dns_id_delete.status >= 200 && dns_id_delete.status < 400) {
fansub.dns_id = null;
fansub = await this.fansubRepo.save(fansub);
}
}
}
}
let dns_id = null;
if (isUpdateMode) {
dns_id = await this.cfs.updateDns(fansub.dns_id, fansub.slug, serverTarget, recordType);
} else {
dns_id = await this.cfs.createDns(fansub.slug, serverTarget, recordType, true);
}
if (dns_id && dns_id.status >= 200 && dns_id.status < 400) {
fansub.dns_id = dns_id.result.id;
fansub = await this.fansubRepo.save(fansub);
result.dns_id = {
id: dns_id.result.id,
name: dns_id.result.name,
content: dns_id.result.content,
proxied: dns_id.result.proxied,
ttl: dns_id.result.ttl,
type: dns_id.result.type,
created_at: dns_id.result.created_on,
updated_at: dns_id.result.modified_on
};
if ('verification_name' in req.body && 'verification_target' in req.body) {
let verification_name: string = this.gs.cleanUpUrlStringRecord(req.body.verification_name);
let verification_target: string = this.gs.cleanUpUrlStringRecord(req.body.verification_target);
if (verification_target && verification_target && serverTarget === 'ghs.google.com') {
const dns_id_alt = await this.cfs.createDns(verification_name, verification_target, 'CNAME');
if (dns_id_alt) {
if (dns_id_alt.status >= 200 && dns_id_alt.status < 400) {
fansub.dns_id_alt = dns_id_alt.result.id;
result.dns_id_alt = {
id: dns_id_alt.result.id,
name: dns_id_alt.result.name,
content: dns_id_alt.result.content,
proxied: dns_id_alt.result.proxied,
ttl: dns_id_alt.result.ttl,
type: dns_id_alt.result.type,
created_at: dns_id_alt.result.created_on,
updated_at: dns_id_alt.result.modified_on
};
}
if (verification_name && verification_target && CONSTANTS.verificationDomain.includes(serverTarget)) {
let dns_id_alt = null;
if (fansub.dns_id_alt) {
dns_id_alt = await this.cfs.updateDns(fansub.dns_id_alt, verification_name, verification_target, 'CNAME');
} else {
dns_id_alt = await this.cfs.createDns(verification_name, verification_target, 'CNAME');
}
}
const fansubUrls = JSON.parse(fansub.urls);
if (fansubUrls && Array.isArray(fansubUrls)) {
const idx = fansubUrls.findIndex(u => u.name === 'web');
if (idx >= 0) {
fansubUrls[idx].url = `https://${dns_id.result.name}`;
if (dns_id_alt && dns_id_alt.status >= 200 && dns_id_alt.status < 400) {
fansub.dns_id_alt = dns_id_alt.result.id;
fansub = await this.fansubRepo.save(fansub);
result.dns_id_alt = {
id: dns_id_alt.result.id,
name: dns_id_alt.result.name,
content: dns_id_alt.result.content,
proxied: dns_id_alt.result.proxied,
ttl: dns_id_alt.result.ttl,
type: dns_id_alt.result.type,
created_at: dns_id_alt.result.created_on,
updated_at: dns_id_alt.result.modified_on
};
} else {
fansubUrls.push({ name: 'web', url: `https://${dns_id.result.name}` });
throw new HttpException({
info: `💩 500 - Cloudflare API :: Gagal Memperbaharui Data 🤬`,
result: {
message: 'Gagal Terhubung Dengan DNS Server!'
}
}, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
fansub.urls = JSON.stringify(fansubUrls);
fansub.user_ = user;
fansub = await this.fansubRepo.save(fansub);
delete fansub.urls;
delete fansub.tags;
delete fansub.view_count;
delete fansub.like_count;
delete fansub.description;
delete fansub.rss_feed;
delete fansub.created_at;
delete fansub.updated_at;
delete fansub.user_;
}
const fansubUrls = JSON.parse(fansub.urls);
if (fansubUrls && Array.isArray(fansubUrls)) {
const idx = fansubUrls.findIndex(u => u.name === 'web');
if (idx >= 0) {
fansubUrls[idx].url = `https://${dns_id.result.name}`;
} else {
fansubUrls.push({ name: 'web', url: `https://${dns_id.result.name}` });
}
}
fansub.urls = JSON.stringify(fansubUrls);
fansub.user_ = user;
fansub = await this.fansubRepo.save(fansub);
delete fansub.urls;
delete fansub.tags;
delete fansub.view_count;
delete fansub.like_count;
delete fansub.description;
delete fansub.rss_feed;
delete fansub.created_at;
delete fansub.updated_at;
delete fansub.user_;
} else {
throw new HttpException({
info: `💩 500 - Cloudflare API :: Gagal Memperbaharui Data 🤬`,
result: {
message: 'Gagal Terhubung Dengan DNS Server!'
}
}, HttpStatus.INTERNAL_SERVER_ERROR);
}
return { result, fansub };
}
Expand All @@ -120,7 +166,7 @@ export class FansubDnsController {
const queryOrder = `${req.query['order'] ? req.query['order'] : 'asc'}`;
const user: UserModel = res.locals['user'];
const dnss = await this.cfs.getDnss(queryName, queryPage, queryRow, querySort, queryOrder);
if (dnss) {
if (dnss && dnss.status >= 200 && dnss.status < 400) {
const records = [];
for (const rec of dnss.results) {
const fansubSlug = rec.name.split(`.${environment.cloudflare.domain}`)[0].toLowerCase();
Expand Down Expand Up @@ -251,7 +297,7 @@ export class FansubDnsController {
}, HttpStatus.FORBIDDEN);
}
}
const r = await this.createNewDns({ req, user, fansub });
const r = await this.createNewOrUpdateDns({ req, user, fansub });
fansub = r.fansub;
const result = r.result;
if (result.dns_id) {
Expand Down Expand Up @@ -306,7 +352,7 @@ export class FansubDnsController {
dns_id_alt: null
};
const dns_id = await this.cfs.detailDns(group.fansub_.dns_id);
if (dns_id) {
if (dns_id && dns_id.status >= 200 && dns_id.status < 400) {
result.dns_id = {
id: dns_id.result.id,
name: dns_id.result.name,
Expand All @@ -320,7 +366,7 @@ export class FansubDnsController {
}
if (group.fansub_.dns_id_alt) {
const dns_id_alt = await this.cfs.detailDns(group.fansub_.dns_id_alt);
if (dns_id_alt) {
if (dns_id_alt && dns_id_alt.status >= 200 && dns_id_alt.status < 400) {
result.dns_id_alt = {
id: dns_id_alt.result.id,
name: dns_id_alt.result.name,
Expand Down Expand Up @@ -379,30 +425,17 @@ export class FansubDnsController {
},
relations: ['fansub_', 'user_']
});
let fansub = await this.fansubRepo.findOneOrFail({
const fansub = await this.fansubRepo.findOneOrFail({
where: [
{ slug: ILike(group.fansub_.slug) }
]
});
if (group.fansub_.dns_id) {
await this.cfs.deleteDns(group.fansub_.dns_id);
fansub.dns_id = null;
}
if (group.fansub_.dns_id_alt) {
await this.cfs.deleteDns(group.fansub_.dns_id_alt);
fansub.dns_id_alt = null;
}
fansub = await this.fansubRepo.save(fansub);
const r = await this.createNewDns({ req, user, fansub });
fansub = r.fansub;
const result = r.result;
if (result.dns_id) {
return {
info: `😅 200 - Cloudflare API :: Pengubahan Sub-Domain Berhasil 🥰`,
result,
fansub
};
}
const r = await this.createNewOrUpdateDns({ req, user, fansub });
return {
info: `😅 200 - Cloudflare API :: Pengubahan Sub-Domain Berhasil 🥰`,
result: r.result,
fansub: r.fansub
};
}
throw new Error('Data Tidak Lengkap!');
} catch (error) {
Expand Down
42 changes: 38 additions & 4 deletions src/api/services/cloudflare.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,17 @@ export class CloudflareService {
}
}

async createDns(name: string, content: string, type: string): Promise<any> {
async createDns(name: string, content: string, type: string, primarySubDomainUrl = null): Promise<any> {
try {
const url = new URL(`${environment.cloudflare.url}/zones/${environment.cloudflare.zoneId}/dns_records`);
const data = {
const data: any = {
name: name.includes(`.${environment.cloudflare.domain}`) ? name : `${name}.${environment.cloudflare.domain}`,
type, content, ttl: 1,
proxied: type === 'A' ? true : false,
comment: environment.cloudflare.comment
proxied: type === 'A' ? true : false
};
if (primarySubDomainUrl) {
data.comment = environment.cloudflare.comment;
}
const res_raw = await this.api.postData(url, JSON.stringify(data), {
'Authorization': `Bearer ${environment.cloudflare.key}`,
...environment.nodeJsXhrHeader
Expand Down Expand Up @@ -109,6 +111,38 @@ export class CloudflareService {
}
}

async updateDns(id: string, name: string, content: string, type: string): Promise<any> {
try {
const url = new URL(`${environment.cloudflare.url}/zones/${environment.cloudflare.zoneId}/dns_records/${id}`);
const data: any = {
name: name.includes(`.${environment.cloudflare.domain}`) ? name : `${name}.${environment.cloudflare.domain}`,
type, content
};
const res_raw = await this.api.putData(url, JSON.stringify(data), {
'Authorization': `Bearer ${environment.cloudflare.key}`,
...environment.nodeJsXhrHeader
});
const res = {
status: res_raw.status,
result: null
};
const res_json: any = await res_raw.json();
if (res_raw.ok) {
this.gs.log(`[CLOUDFLARE_SERVICE-UPDATE_DNS_SUCCESS] 🔥 ${res_raw.status}`, res_json);
res.result = res_json.result;
} else {
this.gs.log(`[CLOUDFLARE_SERVICE-UPDATE_DNS_FAIL] 🔥 ${res_raw.status}`, res_json);
res.result = {
message: res_json.errors[0]?.message
};
}
return res;
} catch (err) {
this.gs.log('[CLOUDFLARE_SERVICE-UPDATE_DNS_ERROR] 🔥', err, 'error');
return null;
}
}

async deleteDns(id: string): Promise<any> {
try {
const url = new URL(`${environment.cloudflare.url}/zones/${environment.cloudflare.zoneId}/dns_records/${id}`);
Expand Down

0 comments on commit 1f4f96c

Please sign in to comment.