mirror of https://github.com/openspug/spug
92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
# Copyright: (c) OpenSpug Organization. https://github.com/openspug/spug
|
|
# Copyright: (c) <spug.dev@gmail.com>
|
|
# Released under the AGPL-3.0 License.
|
|
from django.http.response import HttpResponse
|
|
from django_redis import get_redis_connection
|
|
from apps.config.models import Config, Service, Environment
|
|
from apps.setting.utils import AppSetting
|
|
from apps.app.models import App
|
|
import json
|
|
|
|
|
|
def get_configs(request):
|
|
data = {}
|
|
app, env_id, no_prefix = _parse_params(request)
|
|
if not app or not env_id:
|
|
return HttpResponse('Invalid params', status=400)
|
|
# app own configs
|
|
for item in Config.objects.filter(type='app', o_id=app.id, env_id=env_id).only('key', 'value'):
|
|
key = item.key if no_prefix else f'{app.key}_{item.key}'
|
|
data[key] = item.value
|
|
|
|
# relation app public configs
|
|
if app.rel_apps:
|
|
app_ids = json.loads(app.rel_apps)
|
|
if app_ids:
|
|
id_key_map = {x.id: x.key for x in App.objects.filter(id__in=app_ids)}
|
|
for item in Config.objects.filter(type='app', o_id__in=app_ids, env_id=env_id, is_public=True) \
|
|
.only('key', 'value'):
|
|
key = item.key if no_prefix else f'{id_key_map[item.o_id]}_{item.key}'
|
|
data[key] = item.value
|
|
|
|
# relation service configs
|
|
if app.rel_services:
|
|
src_ids = json.loads(app.rel_services)
|
|
if src_ids:
|
|
id_key_map = {x.id: x.key for x in Service.objects.filter(id__in=src_ids)}
|
|
for item in Config.objects.filter(type='src', o_id__in=src_ids, env_id=env_id).only('key', 'value'):
|
|
key = item.key if no_prefix else f'{id_key_map[item.o_id]}_{item.key}'
|
|
data[key] = item.value
|
|
|
|
# format
|
|
fmt = request.GET.get('format', 'kv')
|
|
if fmt == 'kv':
|
|
return _kv_response(data)
|
|
elif fmt == 'env':
|
|
return _env_response(data)
|
|
elif fmt == 'json':
|
|
return _json_response(data)
|
|
else:
|
|
return HttpResponse('Unsupported output format', status=400)
|
|
|
|
|
|
def _kv_response(data):
|
|
output = ''
|
|
for k, v in sorted(data.items()):
|
|
output += f'{k} = {v}\r\n'
|
|
return HttpResponse(output, content_type='text/plain; charset=utf-8')
|
|
|
|
|
|
def _env_response(data):
|
|
output = ''
|
|
for k, v in sorted(data.items()):
|
|
output += f'{k}={v}\n'
|
|
return HttpResponse(output, content_type='text/plain; charset=utf-8')
|
|
|
|
|
|
def _json_response(data):
|
|
data = dict(sorted(data.items()))
|
|
return HttpResponse(json.dumps(data), content_type='application/json')
|
|
|
|
|
|
def _parse_params(request):
|
|
app, env_id = None, None
|
|
api_token = request.GET.get('apiToken')
|
|
if api_token:
|
|
rds = get_redis_connection()
|
|
content = rds.get(api_token)
|
|
if content:
|
|
app_id, env_id = content.decode().split(',')
|
|
app = App.objects.filter(pk=app_id).first()
|
|
else:
|
|
api_key = AppSetting.get_default('api_key')
|
|
if api_key and request.GET.get('apiKey') == api_key:
|
|
app_key = request.GET.get('app')
|
|
env_key = request.GET.get('env')
|
|
if app_key and env_key:
|
|
app = App.objects.filter(key=app_key).first()
|
|
env = Environment.objects.filter(key=env_key).first()
|
|
if env:
|
|
env_id = env.id
|
|
return app, env_id, request.GET.get('noPrefix')
|