Commit 04bac838 by Luciano Barletta

added no confirmation option

1 parent 35581615
......@@ -50,6 +50,7 @@ Llamando a este link se envían los parámetros de envío del mensaje pasado en
- Bajo 'dest' se envía la dirección de destino, el formato puede variar dependiendo del servicio y dicho formato será documentado
- Bajo 'type' se envía un json { archivo : tipo }, donde a cada archivo (a través del nombre del paso anterior) se le asigna un tipo válido para el servicio
- Bajo 'info' se envía un json { parámetro : valor }, donde se asignan parámetros específicos del servicio
- Bajo 'conf' se envía true o false, dependiendo si se requiere confirmación del mensaje o no. El no envío del parámetro es sinónimo de false. Aunque no se cuente con confirmación, se puede consultar, el único estado no chequeable es 'delivered'
En caso de que no exista el servicio o este no admita el tipo, o que el id no exista, se devolverá un mensaje de error con esa información. Caso contrario, se devolverá el string 'queued' desmotrando que todo salió bien y que el mensaje está en cola.
......@@ -92,6 +93,7 @@ data es un dictionario que contiene los datos del pedido guardados en la base de
- En 'dest' se encuentra el destinatario
- En 'type' se encuentra el formato de lo que queremos mandar
- En 'info' se encuentran los parámetros específicos del servicio, su obligatoriedad depende del servicio
- En 'conf' se especifica si se requiere confimación, no es relevante para la operación
- En 'state' se encuentra el estado del mensaje, que siempre será 'queued' y es completamente irrelevante a la operación
La función retorna un booleano del resultado.
......
from enums import Table, States, Services, Datatypes
from services import serviceFactory
import sqlite3, ipdb, json
import sqlite3, json
class DBconnection:
......@@ -14,6 +14,7 @@ class DBconnection:
Table.dest : "TEXT",
Table.type : "TEXT",
Table.info : "TEXT",
Table.conf : "TEXT",
Table.state : "TEXT"
}
......@@ -105,6 +106,8 @@ class DBconnection:
return serviceFactory(information[Table.serv]).validateinfo(information[column])
elif column == Table.state:
valid = States.validate(information[column])
elif column == Table.conf:
valid = information[column] == None or information[column] == 'None' or information[column].lower() == "true" or information[column].lower() == "false"
if not valid:
return "El dato '" + str(information[column]) + "' no es valido"
......
......@@ -4,7 +4,7 @@ from werkzeug.datastructures import FileStorage
from process import Process
from python_arptable import get_arp_table
from enums import States, Table
import os, ipdb, time, threading, random, datetime
import os, time, threading, random, datetime
app = Flask(__name__)
......@@ -94,7 +94,8 @@ def msg():
Table.serv : request.values['serv'],
Table.dest : request.values['dest'],
Table.type : request.values['type'],
Table.info : request.values.get('info')
Table.info : request.values.get('info'),
Table.conf : request.values.get('conf')
}
state = process.paramstore(query)
return state
......
......@@ -5,6 +5,7 @@ class Table:
dest = "dest"
type = "type"
info = "info"
conf = "conf"
state = "state"
@staticmethod
......
from services import serviceFactory
from database import DBconnection
from enums import Services, States, Datatypes, Table
import ipdb, os, json
import os, json
class Process:
......@@ -39,13 +39,14 @@ class Process:
return "El servicio '" + query[Table.serv] + "' no puede enviar el tipo '" + types[file] + "' destinado al archivo '" + file + "'"
# el parametro no es valido
if not serv.validateinfo(query[Table.info]):
return "El servicio '" + query[Table.serv] + "' no cuenta con algún parámetro, sus parámetros son " + str(serv.Parameters)
return "El servicio '" + query[Table.serv] + "' no cuenta con algún parámetro enviado"
entities = {
Table.dest : query[Table.dest],
Table.serv : query[Table.serv],
Table.type : query[Table.type],
Table.info : query[Table.info],
Table.conf : query[Table.conf],
Table.state : States.queued
}
error = self.conn.update("msg",(Table.id,query[Table.id]),entities)
......@@ -78,6 +79,13 @@ class Process:
# todo enviado
if len(d) == 0:
# no se espera confirmacion
if query[Table.conf] == 'None' or query[Table.conf] == 'None':
self.conn.query("DELETE FROM msg WHERE id = ?",(query[Table.id],))
del query[Table.id]
self.conn.insert("history",query)
# se espera confirmacion
elif query[Table.conf] == "true":
self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.delivered,json.dumps(d),query[Table.id]))
# parcialmente enviado
elif partial:
......
......@@ -63,6 +63,7 @@ class Wpp1(ServiceBase):
return type in Wpp1.Allowed
def validateinfo(self,info):
info = None if info == 'None' else info
if info == None:
return True
i = json.loads(info)
......@@ -133,6 +134,7 @@ class Mail(ServiceBase):
return type in Mail.Allowed
def validateinfo(self,info):
info = None if info == 'None' else info
if info == None:
return False
i = json.loads(info)
......
import os, time, requests, ipdb, json, threading
import os, time, requests, json, threading
from database import DBconnection
URL = "http://192.168.15.75:5000/"
URL = "http://192.168.15.21:5000/"
TESTPHONE = "5493415959169"
TESTMAIL = "sujetodeprueba0110@gmail.com"
FOLDER = "testfolder/"
SENDING_TIME = 60 # aumentar a medida que se vuelva necesario
START_TIME = 10 # cambiar dependiendo de la velocidad de la máquina
def wpp1(phone):
id = requests.post(url = URL + "data", files = {
......@@ -24,7 +25,8 @@ def wpp1(phone):
'wpimage' : 'image',
'wpmedia' : 'document',
'wplink' : 'link'
})
}),
'conf' : 'true'
})
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME)
......@@ -51,7 +53,8 @@ def mail(mail):
}),
'info' : json.dumps({
'subject' : 'Some Subject'
})
}),
'conf' : 'true'
})
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME)
......@@ -83,7 +86,8 @@ def encryption(phone):
'type' : json.dumps({
'plaintext' : 'text',
'plainimage' : 'image'
})
}),
'conf' : 'true'
})
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME)
......@@ -132,20 +136,52 @@ def errors(phone):
})
})
assert error.text == "El servicio 'wpp1' no puede enviar el tipo '-' destinado al archivo 'errortext'"
# parámetro incorrecto
error = requests.post(url = URL + "msg", params = {
'id' : id.text,
'serv' : "wpp1",
'dest' : phone,
'type' : json.dumps({
"errortext" : "text"
}),
'info' : json.dumps({
"-" : "-"
})
})
assert error.text == "El servicio 'wpp1' no cuenta con algún parámetro enviado"
def noconf(phone):
id = requests.post(url = URL + "data", files = {
'wpmsg' : open(FOLDER + "wptext","rb")
})
assert int(id.text) > 0 , id.text + "no es mayor a 0"
state = requests.post(url = URL + "msg", params = {
'id' : id.text,
'serv' : "wpp1",
'dest' : phone,
'type' : json.dumps({
'wpmsg' : 'text'
})
})
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME)
error = requests.post(url = URL + "cons", params = {
'id' : id.text
})
assert (error.text == "El id " + id.text + " no existe") , "'" + error.text + "' no es igual a 'El id " + id.text + " no existe'"
def main():
if os.path.exists("messages.db"):
os.remove("messages.db")
try:
os.system("python3 deploy.py &")
time.sleep(3)
time.sleep(START_TIME)
threads = []
threads.append(threading.Thread(target = wpp1, args = (TESTPHONE,)))
threads.append(threading.Thread(target = encryption, args = (TESTPHONE,)))
threads.append(threading.Thread(target = mail, args = (TESTMAIL,)))
threads.append(threading.Thread(target = errors, args = (TESTPHONE,)))
threads.append(threading.Thread(target = noconf, args = (TESTPHONE,)))
for thread in threads:
thread.start()
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!