func (h *handlerManager) DeleteDevice(ctx context.Context, in *pb.DeviceIdentifier) (*empty.Empty, error) { if err := in.Validate(); err != nil { return nil, errors.Wrap(err, "Invalid Device Identifier") } ctx, claims, err := h.validateTTNAuthAppContext(ctx, in.AppId) if err != nil { return nil, err } if !claims.AppRight(in.AppId, rights.Devices) { return nil, errors.NewErrPermissionDenied(fmt.Sprintf(`No "devices" rights to application "%s"`, in.AppId)) } if _, err := h.handler.applications.Get(in.AppId); err != nil { return nil, errors.Wrap(err, "Application not registered to this Handler") } dev, err := h.handler.devices.Get(in.AppId, in.DevId) if err != nil { return nil, err } _, err = h.deviceManager.DeleteDevice(ctx, &pb_lorawan.DeviceIdentifier{AppEui: &dev.AppEUI, DevEui: &dev.DevEUI}) if err != nil && errors.GetErrType(errors.FromGRPCError(err)) != errors.NotFound { return nil, errors.Wrap(errors.FromGRPCError(err), "Broker did not delete device") } err = h.handler.devices.Delete(in.AppId, in.DevId) if err != nil { return nil, err } return &empty.Empty{}, nil }
func (h *handlerManager) GetDevice(ctx context.Context, in *pb.DeviceIdentifier) (*pb.Device, error) { if err := in.Validate(); err != nil { return nil, errors.Wrap(err, "Invalid Device Identifier") } ctx, claims, err := h.validateTTNAuthAppContext(ctx, in.AppId) if err != nil { return nil, err } if !claims.AppRight(in.AppId, rights.Devices) { return nil, errors.NewErrPermissionDenied(fmt.Sprintf(`No "devices" rights to application "%s"`, in.AppId)) } if _, err := h.handler.applications.Get(in.AppId); err != nil { return nil, errors.Wrap(err, "Application not registered to this Handler") } dev, err := h.handler.devices.Get(in.AppId, in.DevId) if err != nil { return nil, err } pbDev := &pb.Device{ AppId: dev.AppID, DevId: dev.DevID, Device: &pb.Device_LorawanDevice{LorawanDevice: &pb_lorawan.Device{ AppId: dev.AppID, AppEui: &dev.AppEUI, DevId: dev.DevID, DevEui: &dev.DevEUI, DevAddr: &dev.DevAddr, NwkSKey: &dev.NwkSKey, AppSKey: &dev.AppSKey, AppKey: &dev.AppKey, DisableFCntCheck: dev.Options.DisableFCntCheck, Uses32BitFCnt: dev.Options.Uses32BitFCnt, ActivationConstraints: dev.Options.ActivationConstraints, }}, } nsDev, err := h.deviceManager.GetDevice(ctx, &pb_lorawan.DeviceIdentifier{ AppEui: &dev.AppEUI, DevEui: &dev.DevEUI, }) if errors.GetErrType(errors.FromGRPCError(err)) == errors.NotFound { // Re-register the device in the Broker (NetworkServer) h.handler.Ctx.WithFields(log.Fields{ "AppID": dev.AppID, "DevID": dev.DevID, "AppEUI": dev.AppEUI, "DevEUI": dev.DevEUI, }).Warn("Re-registering missing device to Broker") nsDev = dev.GetLoRaWAN() _, err = h.deviceManager.SetDevice(ctx, nsDev) if err != nil { return nil, errors.Wrap(errors.FromGRPCError(err), "Could not re-register missing device to Broker") } } else if err != nil { return pbDev, errors.Wrap(errors.FromGRPCError(err), "Broker did not return device") } pbDev.GetLorawanDevice().FCntUp = nsDev.FCntUp pbDev.GetLorawanDevice().FCntDown = nsDev.FCntDown pbDev.GetLorawanDevice().LastSeen = nsDev.LastSeen return pbDev, nil }