Skip to content
AmsatDatabaseAPI.java 9.3 KiB
Newer Older
xtof's avatar
xtof committed
package org.josast.AmsatServer;

import org.josast.AmsatServer.dao.DatabaseSIDSBeanDAO;
import org.josast.AmsatServer.entity.Classement;
import org.josast.AmsatServer.entity.DatabaseSIDSBean;
import org.josast.AmsatServer.exceptions.SIDSDataNotFound;
import org.josast.influxdb.EntrySatDB;
import org.josast.influxdb.InfluxdbUVSQsatDB;
import org.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigInteger;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;


@RestController
public class AmsatDatabaseAPI {

    @Autowired
    private DatabaseSIDSBeanDAO SIDSBeanDAOimp;
    
    
   
    public AmsatDatabaseAPI() {
        // TODO Auto-generated constructor stub
        
    
    }
    
    /**
     * Interpret SIDS POST request and store the SIDS data in dataBase
     * 
     * @param noradID
     * @param source
     * @param timestamp
     * @param frame
     * @param locator
     * @param longitude
     * @param latitude
     * @param version
     * @return message with ID of the data stored
     */
    @ApiOperation(value = "Send data to the Amsat-F database. The protocole follow the SIDS protocole describe in sids document ")
    @PostMapping("/api/V2/SIDS")
    @ResponseBody
    public String postSIDS(
            @ApiParam(
                    name =  "noradID",
                    type = "long",
                    value = "Norad Identifer, exemple 46287 for Amicalsat",
                    example = "46287",
                    required = true)
            @RequestParam(name = "noradID") int noradID,
            @ApiParam(
                    name =  "source",
                    type = "String",
                    value = "Provider callsign",
                    example = "46287",
                    required = true)
            @RequestParam(name = "source") String source,
            @RequestParam(name = "timestamp") String timestamp,
            @RequestParam(name = "frame") String frame,
            @RequestParam(name = "locator") String locator,
            @RequestParam(name = "longitude") String longitude,
            @RequestParam(name = "latitude") String latitude,
            @RequestParam(name = "version") String version) {

        DatabaseSIDSBean SIDSBeanimp = new DatabaseSIDSBean();

        SIDSBeanimp.setNoradID(noradID);
        SIDSBeanimp.setSource(source);
        SIDSBeanimp.setFrame(frame);
        SIDSBeanimp.setTimestamp(timestamp);
        SIDSBeanimp.setLongitude(longitude);
        SIDSBeanimp.setLatitude(latitude);
        SIDSBeanimp.setVersion(version);

        DatabaseSIDSBean SIDSBeanimpS = SIDSBeanDAOimp.save(SIDSBeanimp);
xtof's avatar
xtof committed

xtof's avatar
xtof committed
            try {
                
                
                switch(noradID) {
                
                // Entry Sat
                case 44429:
                    EntrySatDB App = EntrySatDB.getInstance();
                    // App.addEntrySatData(source, frame);
                    App.addEntrySatData(source, frame, fromISO8601UTC(timestamp));
                    break;
                // UVSQsat
xtof's avatar
xtof committed
                case 99749:     
xtof's avatar
xtof committed
                case 99760:
                case 99999: 
                    InfluxdbUVSQsatDB appDb = InfluxdbUVSQsatDB.getInstance();
                    appDb.store(frame, source);
                    break;
                default:
                    //Do nothing or something else..
                    break;
            }
            
               
        
xtof's avatar
xtof committed
        }
        catch (Exception e )
        {
            System.err.println(e.getStackTrace());
            e.printStackTrace();
        }
xtof's avatar
xtof committed
            return "SIDS frame registred with ID : " + SIDSBeanimpS.getId();
xtof's avatar
xtof committed
    }
    
    @ApiOperation(value = "Return all SIDS data registred in the database")
    @GetMapping("/api/V2/database/sidsData")
    public List<DatabaseSIDSBean> retrieveAllSIDS() {

        return SIDSBeanDAOimp.findAll();

    }

    @ApiOperation(value = "Return number of SIDS data in the database")
    @GetMapping("/api/V2/database/sidsDatacount")
    public long retrieveSIDSCount() {

        return SIDSBeanDAOimp.count();

    }
    
    @ApiOperation(value = "retreive data from the database between two dates ")
    @GetMapping("/api/V2/database/sidsDataDate")
    @ResponseBody
    public String handlerSIDS(
            @ApiParam(
                    name =  "noradID",
                    type = "long",
                    value = "Norad Identifer, exemple 46287 for Amicalsat",
                    example = "46287",
                    required = true)
            @RequestParam(name = "noradID") int noradID,
            @ApiParam(
                    name =  "startTimeStamp",
                    type = "date represented by string with format UTC  (see ISO 8601) ",
                    value = "Start date for the  request",
                    example = "2020-10-10T09:30:06Z",
                    required = true)
            @RequestParam(name = "startTimeStamp") String startTimeStamp,
            @ApiParam(
                    name =  "endTimeStamp",
                    type = "date represented by string with format  UTC  (see ISO 8601)  ",
                    value = "End date for the request",
                    example = "2020-10-10T09:30:06Z",
                    required = true)
            @RequestParam(name = "endTimeStamp") String endTimeStamp)
    {

        Object[][] listFrame = SIDSBeanDAOimp.findSatelliteDataFromTo(noradID,startTimeStamp,endTimeStamp);
        DatabaseSIDSBean[] sb =new DatabaseSIDSBean[listFrame.length];
       for (int i=0;i<listFrame.length;i++)
       {
           DatabaseSIDSBean sbo = new DatabaseSIDSBean();
           Object[] o= listFrame[i];
           BigInteger bi = (BigInteger)o[0];
           sbo.setId(bi.longValue());
           sbo.setNoradID((int) o[1]);
           sbo.setAzimuth((double) o[2]); 
           sbo.setElevation((double) o[3]);
           bi = (BigInteger)o[4];
           sbo.setfDown(bi.longValue());
           sbo.setFrame((String) o[5]); 
           sbo.setLatitude((String) o[6]); 
           sbo.setLongitude((String) o[7]); 
           sbo.setSource((String) o[8]);
           sbo.setTimestamp((String) o[9]);
           sbo.setTncPort((int)  o[10] );           
           sbo.setVersion((String) o[11]) ;
         
                     
           sb[i]=sbo;
       }
        
        JSONArray  json = new JSONArray (sb);
        
        return json.toString();
     
    }
    
    @ApiOperation(value = "Return last SIDS data received")
    @GetMapping("/api/V2/database/lastSidsData")
    public DatabaseSIDSBean retrievelastSidsTest() {

        DatabaseSIDSBean SidsBean = SIDSBeanDAOimp.findTopByOrderByIdDesc();

        if (SidsBean == null)
            throw new SIDSDataNotFound(" Last record not found ");

        return SidsBean;

    }
    
    @ApiOperation(value = "Return all contributor sorted for a Satellite")
    @GetMapping("/api/V2/database/classement/{NoradId}")
    public List<Classement> retrieveClassementByNoradID(
            @PathVariable String NoradId) {

        System.out.println("Classement" + NoradId);
        Object[][] SidsBean = SIDSBeanDAOimp
                .findAllActiveUsersNativeByNoradId(Long.parseLong(NoradId));
        List<Classement> list = new ArrayList<Classement>();
        if (SidsBean == null)
            throw new SIDSDataNotFound(" findAllActiveUsersNative ");
     
        System.out.println(SidsBean.length);
        // System.out.println(" value " +(String) SidsBean[0][0] +" "+
        // (BigInteger) SidsBean[0][1]);
        for (int i = 0; i < SidsBean.length; i++) {

            Classement c = new Classement((String) SidsBean[i][0],
                    (BigInteger) SidsBean[i][1]);
            list.add(c);
        }
//      
        System.out.println(list.size());
        return list;

    }
    
    @ApiOperation(value = "Return all contributor sorted")
    @GetMapping("/api/V2/database/classementall/")
    public List<Classement> retrieveClassement() {

        Object[][] SidsBean = SIDSBeanDAOimp.findAllActiveUsersNative();
        List<Classement> list = new ArrayList<Classement>();
        if (SidsBean == null)
            throw new SIDSDataNotFound(" findAllActiveUsersNative ");

        for (int i = 0; i < SidsBean.length; i++) {

            Classement c = new Classement((String) SidsBean[i][0],
                    (BigInteger) SidsBean[i][1]);
            list.add(c);
        }

        return list;

    }

    
    private Date fromISO8601UTC(String dateStr) {
        TimeZone tz = TimeZone.getTimeZone("UTC");

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        df.setTimeZone(tz);

        try {
            return df.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return null;
    }

}