process.py 3.71 KB
from services import serviceFactory
from database import DBconnection
from enums import Services, States, Datatypes, Table
import ipdb, os, json

class Process:

  def __init__(self,db):
    self.db = db
    self.conn = DBconnection(db)

  # Guarda la data
  def datastore(self,id,path):
    entities = {
      Table.id : id,
      Table.path : path,
      Table.state : States.preprocess
    }
    return self.conn.insert("msg",entities)

  # Guarda los parámetros
  def paramstore(self,query):
    row = self.lookup(query[Table.id])
    # id no existe
    if type(row) == str:
      return row
    # el servicio no existe
    if not Services.validate(query[Table.serv]):
      return "No existe el servicio '" + query[Table.serv] + "'"
    types = json.loads(query[Table.type])
    filelist = os.listdir(row[Table.path])
    for file in types:
      # el archivo no existe
      if file not in filelist:
        return "El archivo '" + file + "' no existe"
      serv = serviceFactory(query[Table.serv])
      # el tipo del mensaje no se puede enviar por el servicio
      if not serv.validatetype(types[file]):
        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)

    entities = {
      Table.dest : query[Table.dest],
      Table.serv : query[Table.serv],
      Table.type : query[Table.type],
      Table.info : query[Table.info],
      Table.state : States.queued
    }
    error = self.conn.update("msg",(Table.id,query[Table.id]),entities)
    if error:
      return error
    return States.queued

  # manda todos los mensajes no enviados
  def send(self):
    rows = self.conn.query("SELECT * FROM msg WHERE state = ?",(States.queued,))
    for query in DBconnection.parseToTable(rows):
      # si no existe la carpeta borrar el mensaje
      if not os.path.exists(query[Table.path]):
        self.conn.query("DELETE FROM msg WHERE id = ?",(query[Table.id],))
        continue

      serv = serviceFactory(query[Table.serv])
      success = serv.send(query)
      d = json.loads(query[Table.type])
      partial = False

      for file in success:
        if success[file] == True:
          # borrar archivo de 'type'
          del d[file]
          # y el archivo mismo
          os.remove(query[Table.path] + file)
          # se borró algo
          partial = True
      
      # todo enviado
      if len(d) == 0:
        self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.delivered,json.dumps(d),query[Table.id]))
      # parcialmente enviado
      elif partial:
        self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.partial,json.dumps(d),query[Table.id]))

  # devuelve el estado de un mensaje, lo archiva si está enviado
  def lookup(self,id):
    rows = self.conn.query("SELECT * FROM msg WHERE id = ?",(id,))
    if rows == []:
      return "El id " + str(id) + " no existe"

    rows = DBconnection.parseToTable(rows)
    row = rows[0]

    if row[Table.state] == States.delivered:
      self.conn.query("DELETE FROM msg WHERE id = ?",(id,))
      entities = {
        Table.path : row[Table.path],
        Table.serv : row[Table.serv],
        Table.dest : row[Table.dest],
        Table.type : row[Table.type],
        Table.state : row[Table.state],
      }
      self.conn.insert("history",entities)

    return row

  # devuelve todas las carpetas de mensajes
  def paths(self):
    rows = self.conn.query("SELECT path FROM msg")
    paths = []
    for row in rows:
      paths.append(row[0])
    return paths