# WARNING: Locale must be UTF-8! IMPORT util IMPORT com IMPORT os TYPE t_sync_cmd RECORD oper STRING, data STRING END RECORD DEFINE r_cmd t_sync_cmd -- el comando recibido por el server DEFINE start_time DATETIME YEAR TO SECOND DEFINE logs DYNAMIC ARRAY OF STRING DEFINE last_request, last_response STRING DEFINE last_date DATETIME YEAR TO SECOND, pcodn CHAR(4) CONSTANT dpy_verb=TRUE -- send messages to standard output CONSTANT log_verb=TRUE -- send messages to the errorlog MAIN DEFINE tout, n, x INTEGER DEFINE d0 DATETIME YEAR TO SECOND DEFINE url, msg STRING DEFINE method, version, headers STRING DEFINE req com.HTTPServiceRequest CALL startlog("err_sync_server.log") CALL check_utf8() RETURNING x, msg IF x != 0 THEN DISPLAY "ERROR: ", msg EXIT PROGRAM 1 END IF CALL show_verb("Starting dbsync server: ...") -- Normally, the port is set by the GAS for load balancing -- For standalone tests you can set FGLAPPSERVER environment variable CALL show_verb("Listening on port : "|| NVL(fgl_getenv("FGLAPPSERVER"),"GAS")) CALL com.WebServiceEngine.Start() LET start_time = CURRENT --LET tout=-1 -- timeout: infinite wait --LET tout=5 -- timeout: 5 seconds LET tout=-1 -- timeout: 10 seconds IF tout=-1 THEN LET msg="The dbsync server is listening (timeout = infinite wait)." ELSE LET msg="The dbsync server is listening (timeout =",tout USING "-<<<<<<&"," seconds)." END IF CALL show_verb(msg) LET n=0 # WHENEVER ERROR CONTINUE WHILE TRUE IF int_flag<>0 THEN LET int_flag=0 EXIT WHILE END IF LET req = com.WebServiceEngine.getHTTPServiceRequest(tout) IF req IS NULL THEN -- timeout CALL show_verb( SFMT("HTTP request timeout...: %1", CURRENT YEAR TO FRACTION)) CONTINUE WHILE END IF LET url = req.getURL() LET method = req.getMethod() DISPLAY "url ",url DISPLAY "metodo ", method IF method != 'OPTIONS' THEN IF method IS NULL OR method != "POST" THEN IF method == "GET" THEN -- TODO: Send server status page back CALL req.sendTextResponse(200,NULL,"Welcome to dbsync server for MBS ...") ELSE CALL show_err(SFMT("Unexpected HTTP request: %1", method)) CALL req.sendTextResponse(400,NULL,"Only POST requests supported") END IF CONTINUE WHILE END IF END IF IF method = 'OPTIONS' THEN CALL req.sendTextResponse(200,NULL,"Welcome") END IF LET version = req.getRequestVersion() IF version IS NULL OR version != "1.1" THEN CALL show_err(SFMT("Unexpected HTTP request version: %1", version)) CONTINUE WHILE END IF LET headers = req.getRequestHeader("DBSync-Client") DISPLAY "header: DBSync-Clent=> ",headers IF headers IS NULL OR headers!= "mbs" THEN CALL show_err(SFMT("Unexpected HTTP request header DBSync-Client: %1", headers)) DISPLAY "HEADER: ",headers CALL req.sendTextResponse(400,NULL,"Bad request in Header DBSync-Client") CONTINUE WHILE END IF LET headers = req.getRequestHeader("Content-Type") DISPLAY "content: ",headers IF headers IS NULL OR headers NOT MATCHES "dbsync/json*" THEN -- ;Charset=UTF-8 CALL show_err(SFMT("Unexpected HTTP request header Content-Type: %1", headers)) CALL req.sendTextResponse(400,NULL,"Bad request, in Header Content-Type") CONTINUE WHILE END IF IF NOT(read_request(req)) THEN -- si el procesamiento del request da error vuelve al loop CONTINUE WHILE END IF LET n = n + 1 LET d0 = CURRENT CALL show_verb( SFMT("oper [%1]: %2", d0, r_cmd.oper) ) --CALL show_verb( SFMT("data: %1", r_cmd.data) ) DISPLAY "opera ",r_cmd.oper CASE r_cmd.oper WHEN "get_status" CALL send_response(req, "SERVER OK") WHEN "info" CALL send_response(req, info()) WHEN "show_logs" CALL send_response(req, show_logs()) WHEN "last_request" CALL send_response(req, last_request()) WHEN "respuesta" LET last_request = r_cmd.data LET last_date = CURRENT CALL send_response(req, last_response:=respuestas(last_request)) OTHERWISE LET msg="invalid operation: " || NVL(r_cmd.oper," ") CALL show_err(msg) CALL req.sendTextResponse(404,NULL,msg) CONTINUE WHILE END CASE LET logs[logs.getLength()+1] = "n:",n USING "<<<<", " ", d0, ' "', r_cmd.oper ,'" ' END WHILE END MAIN FUNCTION read_request(req) DEFINE req com.HTTPServiceRequest DEFINE cmd STRING, p RECORD oper STRING, data RECORD usuario STRING, clave STRING, codigo STRING END RECORD END RECORD INITIALIZE r_cmd.* TO NULL # DISPLAY "request text: ",req.readTextRequest() TRY CALL req.readTextRequest() RETURNING cmd CATCH CALL show_err(SFMT("Unexpected HTTP request read exception: %1", STATUS)) RETURN FALSE END TRY #LET cmd='{"oper":"rnc","data":{"usuario":"crm_user","clave":"XMarmotech2019","tipo_Documento":1,"rnc":"130337391"}}' IF LENGTH(cmd) == 0 THEN -- la operacion va a estar vacia y va dar error por invalida RETURN TRUE END IF TRY CALL util.JSON.parse(cmd, r_cmd) CATCH CALL show_err(SFMT("JSON parse error: %1", STATUS)) RETURN FALSE END TRY RETURN TRUE END FUNCTION FUNCTION send_response(req,res) DEFINE req com.HTTPServiceRequest DEFINE res STRING # DISPLAY "response ",res IF res.getLength() > 50 THEN CALL show_verb( SFMT("Response [%1] -> Length: %2", CURRENT YEAR TO SECOND, LENGTH(res)) ) ELSE CALL show_verb( SFMT("Response [%1] -> %2.", CURRENT YEAR TO SECOND, res.trim()) ) END IF CALL req.setResponseCharset("UTF-8") CALL req.setResponseHeader("dbsync-server","result") CALL req.setResponseHeader("Content-Type","dbsync/json") CALL req.sendTextResponse(200,NULL,res) END FUNCTION FUNCTION check_utf8() IF ORD("€") == 8364 AND LENGTH("€") == 1 THEN RETURN 0, NULL ELSE RETURN -1, "Application locale must be UTF-8, with char length semantics" END IF END FUNCTION FUNCTION show_verb(msg) DEFINE msg STRING IF dpy_verb THEN DISPLAY msg END IF # IF log_verb THEN # CALL errorlog(msg CLIPPED) # END IF END FUNCTION FUNCTION show_err(msg) DEFINE msg STRING DISPLAY "ERROR:",msg # CALL errorlog(msg CLIPPED) END FUNCTION FUNCTION info() DEFINE b base.StringBuffer LET b = base.StringBuffer.create() CALL b.append("
") CALL b.append("[top][logs][last request]") CALL b.append("")
CALL b.append(util.JSON.format(last_request))
CALL b.append("")
END IF
CALL b.append("")
CALL b.append(util.JSON.format(last_response))
CALL b.append("")
END IF
CALL b.append("")
RETURN b.toString()
END FUNCTION
{FUNCTION usuarios()
DEFINE pusuarios DYNAMIC ARRAY OF RECORD
usuarios VARCHAR(50),
password VARCHAR(50),
ocupacion VARCHAR(100),
sec_vend INT,
nombre VARCHAR(30),
email VARCHAR(50)
END RECORD
DEFINE pusuario RECORD
usuarios VARCHAR(50),
password VARCHAR(50),
ocupacion VARCHAR(100),
sec_vend INT,
nombre VARCHAR(30),
email VARCHAR(50)
END RECORD,
i SMALLINT,
selec STRING
LET selec ="SELECT a.email,' ',a.ocupacion,a.sec_vend,a.nombre,a.email
FROM CRMindata.dbo.vendedores a"
PREPARE comando FROM selec
DECLARE u1 CURSOR FOR comando
LET i=0 FOREACH u1 INTO pusuario.* LET i=i+1 LET pusuarios[i].*=pusuario.*
DISPLAY "SUBIENDO USUARIOS...."
END FOREACH; FREE u1
RETURN util.JSON.stringify(pusuarios)
END FUNCTION
}
{
FUNCTION geolocalizacion(s)
DEFINE s STRING
DEFINE file_out RECORD
contenido STRING,
nomb_arch STRING,
lat FLOAT,
long FLOAT,
i BYTE,
file_ext STRING
END RECORD
DEFINE file_out_mov RECORD
contenido STRING,
nomb_arch STRING,
lat FLOAT,
long FLOAT,
i BYTE,
file_ext STRING
END RECORD,
s_out STRING,
archivo STRING,
borrar INT
DEFINE r RECORD
ERROR STRING
END RECORD
LOCATE file_out.i IN MEMORY
TRY
CALL util.JSON.parse(s, file_out)
CATCH
LET r.error = "FGL ERROR: ", err_get(status)
RETURN util.JSON.stringify(r)
END TRY
IF os.Path.exists(file_out.nomb_arch) THEN
CALL os.Path.delete(file_out.nomb_arch) RETURNING borrar
END IF
CALL file_out.i.writeFile(file_out.nomb_arch)
FREE file_out.i
IF os.Path.size(file_out.nomb_arch)>0 THEN
CALL get_exif_latlong_bdl(file_out.nomb_arch) RETURNING file_out_mov.lat,file_out_mov.long
DISPLAY "latitudes ", file_out_mov.lat," LONG ",file_out_mov.long
ELSE
LET file_out_mov.contenido="NO PUEDO GEOLOCALIZAR ESTA FOTO"
END IF
LET s_out = UTIL.JSON.stringify(file_out_mov)
RETURN s_out
END FUNCTION
}