mirror of
https://github.com/Mailu/Mailu.git
synced 2024-12-16 10:59:53 +02:00
5c9cdfe1de
Anything that can be configured in the web administration interface, can also be configured via the Mailu RESTful API. See the section Advanced configuration in the configuration reference for the relevant settings in mailu.env for enabling the API. (API, WEB_API, API_TOKEN).
129 lines
5.1 KiB
Python
129 lines
5.1 KiB
Python
from flask_restx import Resource, fields, marshal
|
|
from . import api, response_fields
|
|
from .. import common
|
|
from ... import models
|
|
|
|
db = models.db
|
|
|
|
alias = api.namespace('alias', description='Alias operations')
|
|
|
|
alias_fields = api.model('Alias', {
|
|
'email': fields.String(description='the alias email address', example='user@example.com', required=True),
|
|
'comment': fields.String(description='a comment'),
|
|
'destination': fields.List(fields.String(description='alias email address', example='user@example.com', required=True)),
|
|
'wildcard': fields.Boolean(description='enable SQL Like wildcard syntax')
|
|
})
|
|
|
|
alias_fields_update = api.model('AliasUpdate', {
|
|
'comment': fields.String(description='a comment'),
|
|
'destination': fields.List(fields.String(description='alias email address', example='user@example.com')),
|
|
'wildcard': fields.Boolean(description='enable SQL Like wildcard syntax')
|
|
})
|
|
|
|
|
|
@alias.route('')
|
|
class Aliases(Resource):
|
|
@alias.doc('list_alias')
|
|
@alias.marshal_with(alias_fields, as_list=True, skip_none=True, mask=None)
|
|
@alias.doc(security='apikey')
|
|
@common.api_token_authorization
|
|
def get(self):
|
|
""" List aliases """
|
|
return models.Alias.query.all()
|
|
|
|
@alias.doc('create_alias')
|
|
@alias.expect(alias_fields)
|
|
@alias.response(200, 'Success', response_fields)
|
|
@alias.response(400, 'Input validation exception', response_fields)
|
|
@alias.response(409, 'Duplicate alias', response_fields)
|
|
@alias.doc(security='apikey')
|
|
@common.api_token_authorization
|
|
def post(self):
|
|
""" Create a new alias """
|
|
data = api.payload
|
|
|
|
alias_found = models.Alias.query.filter_by(email = data['email']).all()
|
|
if alias_found:
|
|
return { 'code': 409, 'message': f'Duplicate alias {data["email"]}'}, 409
|
|
|
|
alias_model = models.Alias(email=data["email"],destination=data['destination'])
|
|
if 'comment' in data:
|
|
alias_model.comment = data['comment']
|
|
if 'wildcard' in data:
|
|
alias_model.wildcard = data['wildcard']
|
|
db.session.add(alias_model)
|
|
db.session.commit()
|
|
|
|
return {'code': 200, 'message': f'Alias {data["email"]} to destination {data["destination"]} has been created'}, 200
|
|
|
|
@alias.route('/<string:alias>')
|
|
class Alias(Resource):
|
|
@alias.doc('find_alias')
|
|
@alias.response(200, 'Success', alias_fields)
|
|
@alias.response(404, 'Alias not found', response_fields)
|
|
@alias.doc(security='apikey')
|
|
@common.api_token_authorization
|
|
def get(self, alias):
|
|
""" Find alias """
|
|
alias_found = models.Alias.query.filter_by(email = alias).all()
|
|
if alias_found is None:
|
|
return { 'code': 404, 'message': f'Alias {alias} cannot be found'}, 404
|
|
else:
|
|
return marshal(alias_found,alias_fields), 200
|
|
|
|
@alias.doc('update_alias')
|
|
@alias.expect(alias_fields_update)
|
|
@alias.response(200, 'Success', response_fields)
|
|
@alias.response(404, 'Alias not found', response_fields)
|
|
@alias.response(400, 'Input validation exception', response_fields)
|
|
@alias.doc(security='apikey')
|
|
@common.api_token_authorization
|
|
def put(self, alias):
|
|
""" Update alias """
|
|
data = api.payload
|
|
alias_found = models.Alias.query.filter_by(email = alias).first()
|
|
if alias_found is None:
|
|
return { 'code': 404, 'message': f'Alias {alias} cannot be found'}, 404
|
|
if 'comment' in data:
|
|
alias_found.comment = data['comment']
|
|
if 'destination' in data:
|
|
destination_csl = ",".join(data['destination'])
|
|
alias_found.destination = destination_csl
|
|
if 'wildcard' in data:
|
|
alias_found.wildcard = data['wildcard']
|
|
db.session.add(alias_found)
|
|
db.session.commit()
|
|
return {'code': 200, 'message': f'Alias {alias} has been updated'}
|
|
|
|
@alias.doc('delete_alias')
|
|
@alias.response(200, 'Success', response_fields)
|
|
@alias.response(404, 'Alias not found', response_fields)
|
|
@alias.doc(security='apikey')
|
|
@common.api_token_authorization
|
|
def delete(self, alias):
|
|
""" Delete alias """
|
|
alias_found = models.Alias.query.filter_by(email = alias).first()
|
|
if alias_found is None:
|
|
return { 'code': 404, 'message': f'Alias {alias} cannot be found'}, 404
|
|
db.session.delete(alias_found)
|
|
db.session.commit()
|
|
return {'code': 200, 'message': f'Alias {alias} has been deleted'}, 200
|
|
|
|
@alias.route('/destination/<string:domain>')
|
|
class AliasWithDest(Resource):
|
|
@alias.doc('find_alias_filter_domain')
|
|
@alias.response(200, 'Success', alias_fields)
|
|
@alias.response(404, 'Alias or domain not found', response_fields)
|
|
@alias.doc(security='apikey')
|
|
@common.api_token_authorization
|
|
def get(self, domain):
|
|
""" Find aliases of domain """
|
|
domain_found = models.Domain.query.filter_by(name=domain).first()
|
|
if domain_found is None:
|
|
return { 'code': 404, 'message': f'Domain {domain} cannot be found'}, 404
|
|
aliases_found = domain_found.aliases
|
|
if aliases_found.count == 0:
|
|
return { 'code': 404, 'message': f'No alias can be found for domain {domain}'}, 404
|
|
else:
|
|
return marshal(aliases_found, alias_fields), 200
|