HI,

This is what I have tried so far but am not able to get the time difference 
in seconds. I mean the time differences between the time stored in the 
map[string]time.Time and
the current time in seconds.

code:

type Server struct {
    idtime map[string]time.Time
}

var my = Server{}

func main() {
    r := mux.NewRouter()
    usersData := r.PathPrefix("/users").Subrouter()
   
 usersData.Path("/{id}").Methods(http.MethodPatch).HandlerFunc(UpdateData)

    fmt.Println("Start listening")
    fmt.Println(http.ListenAndServe(":8080", r))
}

func UpdateData(response http.ResponseWriter, request *http.Request) {

    var (
        localVarHTTPMethod = http.MethodPatch
        patchItems         model.PatchItem
    )

    id := config.GetIdFromRequest(request)

    if request.Method == localVarHTTPMethod {

        err := json.NewDecoder(request.Body).Decode(&patchItems)
        if err != nil {
            common.WriteError(response, common.ErrBadRequest)
            return
        }

        defer request.Body.Close()

        my.idtime = make(map[string]time.Time)
        my.idtime[id] = time.Now()

        go func() {
            for keyid, t := range my.idtime {

                ts := t.Format(time.RFC3339)

                v, err := time.Parse(time.RFC3339, ts)
                if err != nil {
                    fmt.Println(err)
                    os.Exit(1)
                }

                timeRemaining := getTimeRemaining(v)

                if timeRemaining.S >= 60 {
                    // delete resouce in database after 60 seconds
                    deleteResourceUsingIdkey(keyid)
                }
            }
        }()

        common.RespondWith3gppJsonPatchJson(response, http.StatusNoContent, 
nil)
    } else {

        common.WriteError(response, common.ErrMethodNotAllowed)
        return
    }
}

type count struct {
    S int
}

func getTimeRemaining(t time.Time) count {
    currentTime := time.Now()
    difference := t.Sub(currentTime)

    seconds := int(difference.Seconds())

    return count{
        S: seconds,
    }
}

func deleteResourceUsingIdkey(idkey string) {
    // do delete here
}

Any help.


On Tuesday, November 17, 2020 at 10:34:39 AM UTC+2 Anderson Queiroz wrote:

> Just one thing to keep in mind. Likely you have more than one serve 
> instance running to process the requests. Thus it might happen the client 
> will poll a different server on every request. Just imagine you have 
> servers A, B, C behind a load balance and the domain example.com. As the 
> client is pooling example.com, the first request might reach A, the 
> second B and the third C. Now you have the 3 servers tracking the same 
> client. It might happen server A doesn't receive any request from the 
> client for a while, but not because the client isn't pooling any more, but 
> because all requests are being directed to either B or C.
>
> On Tuesday, 17 November 2020 at 07:12:18 UTC+1 Shulhan wrote:
>
>>
>>
>> > On 16 Nov 2020, at 16.24, Afriyie Abraham Kwabena <afriyie...@gmail.com> 
>> wrote: 
>> > 
>> > Hi , 
>> > 
>> > You are right but am new to programming and currently this what i have 
>> done. 
>> > I have an http server handler that receives the PATCH request and 
>> stores the id and the current time stamp of the request. 
>> > But my problem is how to write the worker function to do the clean up 
>> every X seconds. 
>> > 
>> > Code: 
>> > func UpdateData(response http.ResponseWriter, request *http.Request) { 
>> > 
>> > var ( 
>> > localVarHTTPMethod = http.MethodPatch 
>> > patchItems model.PatchItem 
>> > ) 
>> > 
>> > id := config.GetIdFromRequest(request) 
>> > 
>> > if request.Method == localVarHTTPMethod { 
>> > 
>> > err := json.NewDecoder(request.Body).Decode(&patchItems) 
>> > if err != nil { 
>> > common.WriteError(response, common.ErrBadRequest) 
>> > return 
>> > } 
>> > 
>> > defer request.Body.Close() 
>> > 
>> > var idtime = make(map[string]string) 
>> > 
>> > delete(idtime, id) // delete if already exist 
>> > idtime[id] = time.Now() // store id and time stamp in map 
>>
>> You should store idtime inside the server/service type (the one that have 
>> HTTP handlers). For example, 
>>
>> ---- 
>> type Server struct { 
>> idtime map[string]string 
>> } 
>>
>> func (my *Server) UpdateData(...) { 
>> ... 
>> my.idtime[id] = time.Now() 
>> ... 
>> } 
>> ---- 
>>
>> > 
>> > // how do i write a worker to the clean up after every X seconds? 
>> > 
>>
>> Create a function that loop forever and loop the map to check the time, 
>> then run the function using goroutine before you start your HTTP server. 
>>
>> > } else { 
>> > common.WriteError(response, common.ErrMethodNotAllowed) 
>> > return 
>> > } 
>> > } 
>> > 
>>
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/4335869e-3084-4742-aafd-cf7b2fe7fac1n%40googlegroups.com.

Reply via email to